Remedy.Consumer behaviour (Remedy v0.6.5) View Source

Consumer process for gateway event handling.

Consuming Dispatch Events

To handle events, Remedy uses a GenStage implementation.

Remedy defines the producer and producer_consumer in the GenStage design. To consume the events you must create at least one consumer process.

Remedy uses a ConsumerSupervisor to dispatch events, meaning your handlers will each be ran in their own seperate task.

The full list of dispatch events and their inner payload is described in the type specs within this module.

  • Regular payloads are delivered after casting to their schema and ratified against the cache.
  • Irregular payloads are classified as those which do not directly map to a standard discord object. They undergo extensive manipulation prior to updating the cache. They are described under the DISPATCH section of the documentation.

Example

It is recommended that you supervise your consumers. First we set up a supervisor module for our consumers.

#example_supervisor.ex
defmodule MyApp.ExampleSupervisor do
  use Supervisor

  def start_link(args) do
    Supervisor.start_link(__MODULE__, args, name: __MODULE__)
  end

  @impl true
  def init(_init_arg) do
    children = [ExampleConsumer]

    Supervisor.init(children, strategy: :one_for_one)
  end
end

You can then set up your consumer module.

#example_consumer.ex
defmodule ExampleConsumer do
  use Remedy.Consumer

  alias Remedy.Api

  def start_link do
    Consumer.start_link(__MODULE__)
  end

  def handle_event({:MESSAGE_CREATE, %Remedy.Schema.Message{content: content}, _ws_state}) do
    case content do
      "!sleep" ->
        Api.create_message(msg.channel_id, "Going to sleep...")
        Process.sleep(3000)

      "!ping" ->
        Api.create_message(msg.channel_id, "pyongyang!")

      "!raise" ->
        raise "No problems here!"
    end
  end

  def handle_event(_event) do
    :noop
  end
end

Link to this section Summary

Types

Sent when a new channel is created.

Sent when a channel relevant to the current user is deleted.

Sent when a message is pinned or unpinned in a text channel.

Sent when a channel is updated.

Sent when a thread is created or when the user is added to a thread.

Sent when a thread relevant to the current user is deleted.

Sent when the current user gains access to a channel.

Sent when the thread member object for the current user is updated.

Sent when anyone is added to or removed from a thread.

Sent when a thread is updated.

Link to this section Types

Specs

channel_create() ::
  {:CHANNEL_CREATE, Remedy.Schema.Channel.t(), Remedy.Gateway.WSState.t()}

Sent when a new channel is created.

Specs

channel_delete() ::
  {:CHANNEL_DELETE, Remedy.Schema.Channel.t(), Remedy.Gateway.WSState.t()}

Sent when a channel relevant to the current user is deleted.

Specs

channel_pins_update() ::
  {:CHANNEL_PINS_UPDATE, Remedy.Schema.ChannelPinsUpdate.t(),
   Remedy.Gateway.WSState.t()}

Sent when a message is pinned or unpinned in a text channel.

This is not sent when a pinned message is deleted.

Specs

channel_update() ::
  {:CHANNEL_UPDATE, Remedy.Schema.Channel.t(), Remedy.Gateway.WSState.t()}

Sent when a channel is updated.

This is not sent when the field :last_message_id is altered. To keep track of the :last_message_id changes, you must listen for message_create/0 events.

Specs

Specs

guild_available() ::
  {:GUILD_AVAILABLE, Remedy.Schema.Guild.t(), Remedy.Gateway.WSState.t()}

Specs

guild_ban_add() ::
  {:GUILD_BAN_ADD, Remedy.Schema.Ban.t(), Remedy.Gateway.WSState.t()}

Specs

guild_ban_remove() ::
  {:GUILD_BAN_REMOVE, Remedy.Schema.Ban.t(), Remedy.Gateway.WSState.t()}

Specs

guild_create() ::
  {:GUILD_CREATE, Remedy.Schema.Guild.t(), Remedy.Gateway.WSState.t()}

Specs

guild_delete() ::
  {:GUILD_DELETE, Remedy.Schema.Guild.t(), Remedy.Gateway.WSState.t()}

Specs

guild_emojis_update() ::
  {:GUILD_EMOJIS_UPDATE, [Remedy.Schema.Emoji.t()], Remedy.Gateway.WSState.t()}
Link to this type

guild_integrations_update()

View Source

Specs

guild_integrations_update() ::
  {:GUILD_INTEGRATIONS_UPDATE, Remedy.Schema.Integration.t(),
   Remedy.Gateway.WSState.t()}

Specs

guild_member_add() ::
  {:GUILD_MEMBER_ADD, Remedy.Schema.Member.t(), Remedy.Gateway.WSState.t()}

Specs

guild_member_remove() ::
  {:GUILD_MEMBER_REMOVE, Remedy.Schema.Member.t(), Remedy.Gateway.WSState.t()}

Specs

guild_member_update() ::
  {:GUILD_MEMBER_UPDATE, Remedy.Schema.Member.t(), Remedy.Schema.Member.t(),
   Remedy.Gateway.WSState.t()}

Specs

guild_members_chunk() ::
  {:GUILD_MEMBERS_CHUNK, map(), Remedy.Gateway.WSState.t()}

Specs

guild_role_create() ::
  {:GUILD_ROLE_CREATE, Remedy.Schema.Role.t(), Remedy.Gateway.WSState.t()}

Specs

guild_role_delete() ::
  {:GUILD_ROLE_DELETE, Remedy.Schema.Role.t(), Remedy.Gateway.WSState.t()}

Specs

guild_role_update() ::
  {:GUILD_ROLE_UPDATE, Remedy.Schema.Role.t(), Remedy.Gateway.WSState.t()}

Specs

guild_unavailable() ::
  {:GUILD_UNAVAILABLE, UnavailableGuild.t(), Remedy.Gateway.WSState.t()}

Specs

guild_update() ::
  {:GUILD_UPDATE, Remedy.Schema.Guild.t(), Remedy.Gateway.WSState.t()}

Specs

message_ack() :: {:MESSAGE_ACK, map(), Remedy.Gateway.WSState.t()}

Specs

message_create() ::
  {:MESSAGE_CREATE, Remedy.Schema.Message.t(), Remedy.Gateway.WSState.t()}

Specs

message_delete() ::
  {:MESSAGE_DELETE, Remedy.Schema.Message.t(), Remedy.Gateway.WSState.t()}

Specs

message_delete_bulk() ::
  {:MESSAGE_DELETE_BULK, Remedy.Schema.MessageDeleteBulk.t(),
   Remedy.Gateway.WSState.t()}
Link to this type

message_reaction_add()

View Source

Specs

message_reaction_add() ::
  {:MESSAGE_REACTION_ADD, Remedy.Schema.MessageReactionAdd.t(),
   Remedy.Gateway.WSState.t()}
Link to this type

message_reaction_remove()

View Source

Specs

message_reaction_remove() ::
  {:MESSAGE_REACTION_REMOVE, Remedy.Schema.MessageReactionRemove.t(),
   Remedy.Gateway.WSState.t()}
Link to this type

message_reaction_remove_all()

View Source

Specs

message_reaction_remove_all() ::
  {:MESSAGE_REACTION_REMOVE_ALL, Remedy.Schema.MessageReactionRemoveAll.t(),
   Remedy.Gateway.WSState.t()}
Link to this type

message_reaction_remove_emoji()

View Source

Specs

message_reaction_remove_emoji() ::
  {:MESSAGE_REACTION_REMOVE_EMOJI, Remedy.Schema.MessageReactionRemoveEmoji.t(),
   Remedy.Gateway.WSState.t()}

Specs

message_update() ::
  {:MESSAGE_UPDATE, Remedy.Schema.Message.t(), Remedy.Gateway.WSState.t()}

Specs

presence_update() ::
  {:PRESENCE_UPDATE, Remedy.Schema.PresenceUpdate.t(),
   Remedy.Gateway.WSState.t()}

Specs

ready() :: {:READY, Remedy.Schema.Ready.t(), Remedy.Gateway.WSState.t()}

Specs

resumed() :: {:RESUMED, map(), Remedy.Gateway.WSState.t()}

Specs

thread_create() ::
  {:THREAD_CREATE, Remedy.Schema.Channel.t(), Remedy.Gateway.WSState.t()}

Sent when a thread is created or when the user is added to a thread.

When being added to an existing private thread, includes a thread member object.

Specs

thread_delete() ::
  {:THREAD_DELETE, Remedy.Schema.Channel.t(), Remedy.Gateway.WSState.t()}

Sent when a thread relevant to the current user is deleted.

The inner payload is a subset of the channel object, containing just the id, guild_id, parent_id, and type fields.

Specs

thread_list_sync() ::
  {:THREAD_LIST_SYNC, Remedy.Schema.Channel.t(), Remedy.Gateway.WSState.t()}

Sent when the current user gains access to a channel.

Link to this type

thread_member_update()

View Source

Specs

thread_member_update() ::
  {:THREAD_MEMBER_UPDATE, Remedy.Schema.Channel.t(), Remedy.Gateway.WSState.t()}

Sent when the thread member object for the current user is updated.

The inner payload is a thread member object. This event is documented for completeness, but unlikely to be used by most bots. For bots, this event largely is just a signal that you are a member of the thread. See the threads docs for more details.

Link to this type

thread_members_update()

View Source

Specs

thread_members_update() ::
  {:THREAD_MEMBERS_UPDATE, Remedy.Schema.Channel.t(),
   Remedy.Gateway.WSState.t()}

Sent when anyone is added to or removed from a thread.

If the current user does not have the GUILD_MEMBERS Gateway Intent, then this event will only be sent if the current user was added to or removed from the thread.

Specs

thread_update() ::
  {:THREAD_UPDATE, Remedy.Schema.Channel.t(), Remedy.Gateway.WSState.t()}

Sent when a thread is updated.

The inner payload is a channel object. This is not sent when the field :last_message_id is altered. To keep track of the :last_message_id changes, you must listen for message_create/0 events.

Specs

typing_start() ::
  {:TYPING_START, Remedy.Schema.TypingStart.t(), Remedy.Gateway.WSState.t()}

Specs

user_update() ::
  {:USER_UPDATE, Remedy.Schema.User.t(), Remedy.Gateway.WSState.t()}

Specs

voice_ready() :: {:VOICE_READY, VoiceReady.t(), VoiceWSState.t()}

Specs

voice_server_update() ::
  {:VOICE_SERVER_UPDATE, VoiceServerUpdate.t(), Remedy.Gateway.WSState.t()}
Link to this type

voice_speaking_update()

View Source

Specs

voice_speaking_update() ::
  {:VOICE_SPEAKING_UPDATE, SpeakingUpdate.t(), VoiceWSState.t()}

Specs

voice_state_update() ::
  {:VOICE_STATE_UPDATE, VoiceState.t(), Remedy.Gateway.WSState.t()}

Specs

webhooks_update() :: {:WEBHOOKS_UPDATE, map(), Remedy.Gateway.WSState.t()}

Link to this section Callbacks

Specs

handle_event(event()) :: any()
handle_event(any()) :: :noop