Current section

Files

Jump to
quarrel lib quarrel nostrum_consumer.ex
Raw

lib/quarrel/nostrum_consumer.ex

defmodule Quarrel.NostrumConsumer do
@moduledoc false
# Handles getting data out of Nostrum into the Quarrel stack
use Nostrum.Consumer
require Logger
alias Nostrum.Struct.{
Channel,
Event.MessageDelete,
Event.MessageDeleteBulk,
Event.SpeakingUpdate,
Guild,
Guild.Member,
Guild.Role,
Guild.UnavailableGuild,
Interaction,
Message,
User
}
alias Quarrel.GuildSupervisor
def handle_event({:CHANNEL_CREATE, %Channel{guild_id: guild_id} = channel, _}) do
dispatch(guild_id, :handle_channel_create, [channel])
end
def handle_event({:CHANNEL_DELETE, %Channel{guild_id: guild_id} = channel, _}) do
dispatch(guild_id, :handle_channel_delete, [channel])
end
def handle_event({:CHANNEL_UPDATE, {old, %Channel{guild_id: guild_id} = channel}, _}) do
dispatch(guild_id, :handle_channel_update, [old, channel])
end
def handle_event({:CHANNEL_PINS_UPDATE, %{guild_id: guild_id} = map, _}) do
dispatch(guild_id, :handle_channel_pins_update, [map])
end
def handle_event({:GUILD_BAN_ADD, {guild_id, %User{} = user}, _}) do
dispatch(guild_id, :handle_guild_ban_add, [user])
end
def handle_event({:GUILD_BAN_REMOVE, {guild_id, %User{} = user}, _}) do
dispatch(guild_id, :handle_guild_ban_remove, [user])
end
def handle_event({:GUILD_CREATE, %Guild{id: guild_id} = guild, _}) do
dispatch(guild_id, :handle_guild_create, [guild])
end
def handle_event({:GUILD_AVAILABLE, %Guild{id: guild_id} = guild, _}) do
with {:ok, bot} <- Nostrum.Api.get_current_user(),
{:ok, config} <- Quarrel.get_settings(guild),
{:ok, _pid} <- GuildSupervisor.guild_available(guild, config, bot) do
dispatch(guild_id, :handle_guild_available, [guild])
else
error ->
Logger.error("GUILD_AVAILABLE failure: #{inspect(error)}")
end
end
def handle_event({:GUILD_UNAVAILABLE, %UnavailableGuild{id: guild_id} = unavailable_guild, _}) do
_ = dispatch(guild_id, :handle_guild_unavailable, [unavailable_guild])
GuildSupervisor.guild_unavailable(unavailable_guild)
end
def handle_event(
{:GUILD_UPDATE, {%Guild{id: guild_id} = old, %Guild{id: guild_id} = new_guild}, _}
) do
dispatch(guild_id, :handle_guild_update, [old, new_guild])
GuildSupervisor.guild_update(old, new_guild)
end
def handle_event({:GUILD_DELETE, {%Guild{id: guild_id} = guild, unavailable}, _}) do
dispatch(guild_id, :handle_guild_delete, [guild, unavailable])
GuildSupervisor.guild_delete(guild)
end
def handle_event({:GUILD_EMOJIS_UPDATE, {guild_id, old_emojis, new_emojis}, _}) do
dispatch(guild_id, :handle_guild_emojis_update, [old_emojis, new_emojis])
end
def handle_event({:GUILD_INTERACTIONS_UPDATE, %{guild_id: guild_id} = map, _}) do
dispatch(guild_id, :handle_guild_interactions_update, [map])
end
# {:GUILD_INTEGRATIONS_UPDATE, %{guild_id: 865257998691991572}, %Nostrum.Struct.WSState{conn: #PID<0.555.0>, conn_pid: #PID<0.553.0>, gateway: "gateway.discord.gg/?compress=zlib-stream&encoding=etf&v=6", heartbeat_ack: true, heartbeat_interval: 41250, heartbeat_ref: {-576460668006735, #Reference<0.1906127583.1803026438.229193>}, last_heartbeat_ack: ~U[2021-08-31 17:59:53.103451Z], last_heartbeat_send: ~U[2021-08-31 17:59:53.026216Z], seq: 139, session: "eaa991d6dd4f5ddde6043dce731ac75e", shard_num: 0, shard_pid: nil, zlib_ctx: #Reference<0.1906127583.1803157510.229013>}}
def handle_event({:GUILD_MEMBER_ADD, {guild_id, %Member{} = member}, _}) do
dispatch(guild_id, :handle_guild_member_add, [member])
end
def handle_event({:GUILD_MEMBERS_CHUNK, %{guild_id: guild_id} = map, _}) do
dispatch(guild_id, :handle_guild_members_chunk, [map])
end
def handle_event({:GUILD_MEMBER_REMOVE, {guild_id, %Member{} = old_member}}) do
dispatch(guild_id, :handle_guild_member_remove, [old_member])
end
def handle_event({:GUILD_MEMBER_UPDATE, {guild_id, old, %Member{} = new}, _}) do
dispatch(guild_id, :handle_guild_member_update, [old, new])
end
def handle_event({:GUILD_ROLE_CREATE, {guild_id, %Role{} = role}, _}) do
dispatch(guild_id, :handle_guild_role_create, [role])
end
def handle_event({:GUILD_ROLE_DELETE, {guild_id, %Role{} = old_role}, _}) do
dispatch(guild_id, :handle_guild_role_delete, [old_role])
end
def handle_event({:GUILD_ROLE_UPDATE, {guild_id, old_role, new_role}, _}) do
dispatch(guild_id, :handle_guild_role_update, [old_role, new_role])
end
def handle_event({:INTERACTION_CREATE, %Interaction{guild_id: guild_id} = interaction, _}) do
dispatch(guild_id, :handle_interaction_create, [interaction])
end
def handle_event({:MESSAGE_CREATE, %Message{guild_id: guild_id} = message, _}) do
dispatch(guild_id, :handle_message_create, [message])
end
def handle_event({:MESSAGE_DELETE, %MessageDelete{guild_id: guild_id} = message_delete, _}) do
dispatch(guild_id, :handle_message_delete, [message_delete])
end
def handle_event(
{:MESSAGE_DELETE_BULK, %MessageDeleteBulk{guild_id: guild_id} = message_delete_bulk, _}
) do
dispatch(guild_id, :handle_message_delete_bulk, [message_delete_bulk])
end
def handle_event({:MESSAGE_UPDATE, %Message{guild_id: guild_id} = message, _}) do
dispatch(guild_id, :handle_message_update, [message])
end
def handle_event({:MESSAGE_REACTION_ADD, %{guild_id: guild_id} = map, _}) do
dispatch(guild_id, :handle_message_reaction_add, [map])
end
def handle_event({:MESSAGE_REACTION_REMOVE, %{guild_id: guild_id} = map, _}) do
dispatch(guild_id, :handle_message_reaction_remove, [map])
end
def handle_event({:MESSAGE_REACTION_REMOVE_ALL, %{guild_id: guild_id} = map, _}) do
dispatch(guild_id, :handle_message_reaction_remove_all, [map])
end
def handle_event({:MESSAGE_REACTION_REMOVE_EMOJI, %{guild_id: guild_id} = map, _}) do
dispatch(guild_id, :handle_message_reaction_remove, [map])
end
def handle_event({:MESSAGE_ACK, %{guild_id: guild_id} = map, _}) do
dispatch(guild_id, :handle_message_ack, [map])
end
def handle_event({:PRESENCE_UPDATE, {guild_id, old_presence, new_presence}, _}) do
dispatch(guild_id, :handle_presence_update, [old_presence, new_presence])
end
def handle_event({:READY, map, _}) do
dispatch(:handle_ready, [map])
end
def handle_event({:RESUMED, map, _}) do
dispatch(:handle_resumed, [map])
end
def handle_event({:TYPING_START, %{guild_id: guild_id} = map, _}) do
dispatch(guild_id, :handle_typing_start, [map])
end
def handle_event({:USER_UPDATE, {old_user, %User{} = new_user}, _}) do
dispatch(:handle_user_update, [old_user, new_user])
end
def handle_event(
{:VOICE_SPEAKING_UPDATE, %SpeakingUpdate{guild_id: guild_id} = speaking_update, _}
) do
dispatch(guild_id, :handle_voice_speaking_update, [speaking_update])
end
def handle_event({:VOICE_STATE_UPDATE, %{guild_id: guild_id} = map, _}) do
dispatch(guild_id, :handle_voice_state_update, [map])
end
def handle_event({:VOICE_SERVER_UPDATE, %{guild_id: guild_id} = map, _}) do
dispatch(guild_id, :handle_voice_server_update, [map])
end
def handle_event({:WEBHOOKS_UPDATE, %{guild_id: guild_id} = map, _}) do
dispatch(guild_id, :handle_webhooks_update, [map])
end
def handle_event(event) do
Logger.error("Unhandled Event from Discord Gateway: #{inspect(event)}")
end
@spec dispatch(integer, atom, [term]) :: any()
defp dispatch(guild_id, function, args) do
# IO.inspect({guild_id, function, args})
Phoenix.PubSub.broadcast(Quarrel.PubSub, "guild:#{guild_id}", {__MODULE__, function, args})
end
@spec dispatch(atom, [term]) :: any()
defp dispatch(function, args) do
# IO.inspect({nil, function, args})
Phoenix.PubSub.broadcast(Quarrel.PubSub, "guild", {__MODULE__, function, args})
end
end