Current section
Files
Jump to
Current section
Files
src/discord_gleam@event_handler.erl
-module(discord_gleam@event_handler).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/discord_gleam/event_handler.gleam").
-export([name_from_mode/1, bot_from_mode/1, set_bot/2, handle_event/5]).
-export_type([handler_message/1, internal_message/1, next/2, mode/2, packet/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
-type handler_message(MMY) :: {discord_packet, packet()} | {user, MMY}.
-type internal_message(MMZ) :: {internal_packet, binary()} |
{internal_user, MMZ}.
-type next(MNA, MNB) :: {continue,
MNA,
gleam@option:option(gleam@erlang@process:selector(MNB))} |
stop |
{stop_abnormal, binary()}.
-type mode(MNC, MND) :: {simple,
discord_gleam@bot:bot(),
list(fun((discord_gleam@bot:bot(), packet()) -> nil)),
next(MNC, MND),
MNC} |
{normal,
discord_gleam@bot:bot(),
gleam@erlang@process:name(MND),
fun((gleam@erlang@process:selector(MND)) -> {MNC,
gleam@erlang@process:selector(MND)}),
fun((discord_gleam@bot:bot(), MNC, handler_message(MND)) -> next(MNC, MND))}.
-type packet() :: {ready_packet, discord_gleam@ws@packets@ready:ready_data()} |
{interaction_create_packet,
discord_gleam@ws@packets@interaction_create:interaction_create_packet_data()} |
{message_delete_packet,
discord_gleam@ws@packets@message_delete:message_delete_packet_data()} |
{message_packet, discord_gleam@ws@packets@message:message_packet_data()} |
{message_update_packet,
discord_gleam@ws@packets@message:message_packet_data()} |
{message_delete_bulk_packet,
discord_gleam@ws@packets@message_delete_bulk:message_delete_bulk_packet_data()} |
{message_reaction_add,
discord_gleam@ws@packets@message_reaction_add:message_reaction_add_packet_data()} |
{message_reaction_remove,
discord_gleam@ws@packets@message_reaction_remove:message_reaction_remove_packet_data()} |
{channel_create_packet, discord_gleam@types@channel:channel()} |
{channel_delete_packet, discord_gleam@types@channel:channel()} |
{channel_update_packet, discord_gleam@types@channel:channel()} |
{guild_ban_add_packet,
discord_gleam@ws@packets@guild_ban_add:guild_ban_add_packet_data()} |
{guild_ban_remove_packet,
discord_gleam@ws@packets@guild_ban_remove:guild_ban_remove_packet_data()} |
{guild_create_packet, discord_gleam@types@guild:guild()} |
{guild_update_packet, discord_gleam@types@guild:guild()} |
{guild_delete_packet,
discord_gleam@ws@packets@guild_delete:guild_delete_data()} |
{guild_role_create_packet,
discord_gleam@ws@packets@guild_role_create:guild_role_create_packet_data()} |
{guild_role_update_packet,
discord_gleam@ws@packets@guild_role_update:guild_role_update_packet_data()} |
{guild_role_delete_packet,
discord_gleam@ws@packets@guild_role_delete:guild_role_delete_packet_data()} |
{guild_member_add_packet,
discord_gleam@ws@packets@guild_member_add:guild_member_add_packet_data()} |
{guild_member_update_packet,
discord_gleam@ws@packets@guild_member_update:guild_member_update_packet_data()} |
{guild_member_remove_packet,
discord_gleam@ws@packets@guild_member_remove:guild_member_remove_packet_data()} |
{guild_members_chunk_packet,
discord_gleam@ws@packets@guild_members_chunk:guild_members_chunk_packet_data()} |
{presence_update_packet, discord_gleam@types@presence:presence()} |
{unknown_packet, discord_gleam@ws@packets@generic:generic_packet()}.
-file("src/discord_gleam/event_handler.gleam", 89).
?DOC(" Check if the mode is normal mode\n").
-spec name_from_mode(mode(any(), MNF)) -> {ok, gleam@erlang@process:name(MNF)} |
{error, nil}.
name_from_mode(Mode) ->
case Mode of
{normal, _, Name, _, _} ->
{ok, Name};
{simple, _, _, _, _} ->
{error, nil}
end.
-file("src/discord_gleam/event_handler.gleam", 99).
?DOC(" Get the bot from all possible modes\n").
-spec bot_from_mode(mode(any(), any())) -> discord_gleam@bot:bot().
bot_from_mode(Mode) ->
case Mode of
{simple, Bot, _, _, _} ->
Bot;
{normal, Bot@1, _, _, _} ->
Bot@1
end.
-file("src/discord_gleam/event_handler.gleam", 106).
-spec set_bot(mode(MNP, MNQ), discord_gleam@bot:bot()) -> mode(MNP, MNQ).
set_bot(Mode, Bot) ->
case Mode of
{simple, _, _, _, _} ->
{simple,
Bot,
erlang:element(3, Mode),
erlang:element(4, Mode),
erlang:element(5, Mode)};
{normal, _, _, _, _} ->
{normal,
Bot,
erlang:element(3, Mode),
erlang:element(4, Mode),
erlang:element(5, Mode)}
end.
-file("src/discord_gleam/event_handler.gleam", 180).
-spec cache_message(
discord_gleam@bot:bot(),
discord_gleam@ws@packets@message:message_packet_data()
) -> nil.
cache_message(Bot, Msg) ->
booklet_ffi:update(
erlang:element(2, erlang:element(5, Bot)),
fun(Cache) ->
Cache@1 = gleam@dict:insert(Cache, erlang:element(2, Msg), Msg),
case maps:size(Cache@1) > erlang:element(6, Bot) of
true ->
case begin
_pipe = maps:keys(Cache@1),
gleam@list:reduce(
_pipe,
fun(A, B) ->
case discord_gleam@discord@snowflake:compare(
A,
B
) of
lt ->
A;
_ ->
B
end
end
)
end of
{ok, Oldest} ->
gleam@dict:delete(Cache@1, Oldest);
{error, _} ->
Cache@1
end;
false ->
Cache@1
end
end
),
nil.
-file("src/discord_gleam/event_handler.gleam", 208).
?DOC(" For handling some events the library needs to handle, for functionality\n").
-spec internal_handler(
discord_gleam@bot:bot(),
packet(),
booklet:booklet(discord_gleam@ws@gateway_state:gateway_state())
) -> nil.
internal_handler(Bot, Packet, State_ets) ->
case Packet of
{message_packet, Msg} ->
cache_message(Bot, Msg);
{message_update_packet, Msg@1} ->
cache_message(Bot, Msg@1);
{ready_packet, Ready} ->
booklet_ffi:update(
State_ets,
fun(State) ->
{gateway_state,
erlang:element(2, State),
erlang:element(5, Ready),
gleam@string:replace(
erlang:element(6, Ready),
<<"wss://"/utf8>>,
<<""/utf8>>
)}
end
),
nil;
_ ->
nil
end.
-file("src/discord_gleam/event_handler.gleam", 287).
-spec decode_packet(binary()) -> packet().
decode_packet(Msg) ->
Generic_packet = discord_gleam@ws@packets@generic:from_json_string(Msg),
case erlang:element(2, Generic_packet) of
{some, T} ->
case T of
<<"READY"/utf8>> ->
case discord_gleam@ws@packets@ready:from_json_string(Msg) of
{ok, Packet} ->
{ready_packet, erlang:element(5, Packet)};
{error, Err} ->
logging:log(
error,
<<"Failed to decode READY packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"MESSAGE_CREATE"/utf8>> ->
case discord_gleam@ws@packets@message:from_json_string(Msg) of
{ok, Packet@1} ->
{message_packet, erlang:element(5, Packet@1)};
{error, Err@1} ->
logging:log(
error,
<<"Failed to decode MESSAGE_CREATE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@1
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"MESSAGE_UPDATE"/utf8>> ->
case discord_gleam@ws@packets@message_update:from_json_string(
Msg
) of
{ok, Packet@2} ->
{message_update_packet, erlang:element(5, Packet@2)};
{error, Err@2} ->
logging:log(
error,
<<"Failed to decode MESSAGE_UPDATE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@2
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"MESSAGE_DELETE"/utf8>> ->
case discord_gleam@ws@packets@message_delete:from_json_string(
Msg
) of
{ok, Packet@3} ->
{message_delete_packet, erlang:element(5, Packet@3)};
{error, Err@3} ->
logging:log(
error,
<<"Failed to decode MESSAGE_DELETE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@3
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"MESSAGE_DELETE_BULK"/utf8>> ->
case discord_gleam@ws@packets@message_delete_bulk:from_json_string(
Msg
) of
{ok, Packet@4} ->
{message_delete_bulk_packet,
erlang:element(5, Packet@4)};
{error, Err@4} ->
logging:log(
error,
<<"Failed to decode MESSAGE_DELETE_BULK packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@4
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"MESSAGE_REACTION_ADD"/utf8>> ->
case discord_gleam@ws@packets@message_reaction_add:from_json_string(
Msg
) of
{ok, Packet@5} ->
{message_reaction_add, erlang:element(5, Packet@5)};
{error, Err@5} ->
logging:log(
error,
<<"Failed to decode MESSAGE_REACTION_ADD packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@5
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"MESSAGE_REACTION_REMOVE"/utf8>> ->
case discord_gleam@ws@packets@message_reaction_remove:from_json_string(
Msg
) of
{ok, Packet@6} ->
{message_reaction_remove,
erlang:element(5, Packet@6)};
{error, Err@6} ->
logging:log(
error,
<<"Failed to decode MESSAGE_REACTION_REMOVE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@6
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"INTERACTION_CREATE"/utf8>> ->
case discord_gleam@ws@packets@interaction_create:from_json_string(
Msg
) of
{ok, Packet@7} ->
{interaction_create_packet,
erlang:element(5, Packet@7)};
{error, Err@7} ->
logging:log(
error,
<<"Failed to decode INTERACTION_CREATE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@7
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"CHANNEL_CREATE"/utf8>> ->
case discord_gleam@ws@packets@channel_create:from_json_string(
Msg
) of
{ok, Packet@8} ->
{channel_create_packet, erlang:element(5, Packet@8)};
{error, Err@8} ->
logging:log(
error,
<<"Failed to decode CHANNEL_CREATE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@8
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"CHANNEL_DELETE"/utf8>> ->
case discord_gleam@ws@packets@channel_delete:from_json_string(
Msg
) of
{ok, Packet@9} ->
{channel_delete_packet, erlang:element(5, Packet@9)};
{error, Err@9} ->
logging:log(
error,
<<"Failed to decode CHANNEL_DELETE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@9
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"CHANNEL_UPDATE"/utf8>> ->
case discord_gleam@ws@packets@channel_update:from_json_string(
Msg
) of
{ok, Packet@10} ->
{channel_update_packet,
erlang:element(5, Packet@10)};
{error, Err@10} ->
logging:log(
error,
<<"Failed to decode CHANNEL_UPDATE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@10
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"GUILD_BAN_ADD"/utf8>> ->
case discord_gleam@ws@packets@guild_ban_add:from_json_string(
Msg
) of
{ok, Packet@11} ->
{guild_ban_add_packet, erlang:element(5, Packet@11)};
{error, Err@11} ->
logging:log(
error,
<<"Failed to decode GUILD_BAN_ADD packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@11
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"GUILD_BAN_REMOVE"/utf8>> ->
case discord_gleam@ws@packets@guild_ban_remove:from_json_string(
Msg
) of
{ok, Packet@12} ->
{guild_ban_remove_packet,
erlang:element(5, Packet@12)};
{error, Err@12} ->
logging:log(
error,
<<"Failed to decode GUILD_BAN_REMOVE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@12
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"GUILD_CREATE"/utf8>> ->
case discord_gleam@ws@packets@guild_create:from_json_string(
Msg
) of
{ok, Packet@13} ->
{guild_create_packet, erlang:element(5, Packet@13)};
{error, Err@13} ->
logging:log(
error,
<<"Failed to decode GUILD_CREATE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@13
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"GUILD_UPDATE"/utf8>> ->
case discord_gleam@ws@packets@guild_update:from_json_string(
Msg
) of
{ok, Packet@14} ->
{guild_update_packet, erlang:element(5, Packet@14)};
{error, Err@14} ->
logging:log(
error,
<<"Failed to decode GUILD_UPDATE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@14
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"GUILD_DELETE"/utf8>> ->
case discord_gleam@ws@packets@guild_delete:from_json_string(
Msg
) of
{ok, Packet@15} ->
{guild_delete_packet, erlang:element(5, Packet@15)};
{error, Err@15} ->
logging:log(
error,
<<"Failed to decode GUILD_DELETE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@15
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"GUILD_ROLE_CREATE"/utf8>> ->
case discord_gleam@ws@packets@guild_role_create:from_json_string(
Msg
) of
{ok, Packet@16} ->
{guild_role_create_packet,
erlang:element(5, Packet@16)};
{error, Err@16} ->
logging:log(
error,
<<"Failed to decode GUILD_ROLE_CREATE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@16
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"GUILD_ROLE_UPDATE"/utf8>> ->
case discord_gleam@ws@packets@guild_role_update:from_json_string(
Msg
) of
{ok, Packet@17} ->
{guild_role_update_packet,
erlang:element(5, Packet@17)};
{error, Err@17} ->
logging:log(
error,
<<"Failed to decode GUILD_ROLE_UPDATE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@17
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"GUILD_ROLE_DELETE"/utf8>> ->
case discord_gleam@ws@packets@guild_role_delete:from_json_string(
Msg
) of
{ok, Packet@18} ->
{guild_role_delete_packet,
erlang:element(5, Packet@18)};
{error, Err@18} ->
logging:log(
error,
<<"Failed to decode GUILD_ROLE_DELETE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@18
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"GUILD_MEMBER_ADD"/utf8>> ->
case discord_gleam@ws@packets@guild_member_add:from_json_string(
Msg
) of
{ok, Packet@19} ->
{guild_member_add_packet,
erlang:element(5, Packet@19)};
{error, Err@19} ->
logging:log(
error,
<<"Failed to decode GUILD_MEMBER_ADD packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@19
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"GUILD_MEMBER_UPDATE"/utf8>> ->
case discord_gleam@ws@packets@guild_member_update:from_json_string(
Msg
) of
{ok, Packet@20} ->
{guild_member_update_packet,
erlang:element(5, Packet@20)};
{error, Err@20} ->
logging:log(
error,
<<"Failed to decode GUILD_MEMBER_UPDATE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@20
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"GUILD_MEMBER_REMOVE"/utf8>> ->
case discord_gleam@ws@packets@guild_member_remove:from_json_string(
Msg
) of
{ok, Packet@21} ->
{guild_member_remove_packet,
erlang:element(5, Packet@21)};
{error, Err@21} ->
logging:log(
error,
<<"Failed to decode GUILD_MEMBER_REMOVE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@21
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"GUILD_MEMBERS_CHUNK"/utf8>> ->
case discord_gleam@ws@packets@guild_members_chunk:from_json_string(
Msg
) of
{ok, Packet@22} ->
{guild_members_chunk_packet,
erlang:element(5, Packet@22)};
{error, Err@22} ->
logging:log(
error,
<<"Failed to decode GUILD_MEMBERS_CHUNK packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@22
))/binary>>
),
{unknown_packet, Generic_packet}
end;
<<"PRESENCE_UPDATE"/utf8>> ->
case discord_gleam@ws@packets@presence_update:from_json_string(
Msg
) of
{ok, Packet@23} ->
{presence_update_packet,
erlang:element(5, Packet@23)};
{error, Err@23} ->
logging:log(
error,
<<"Failed to decode PRESENCE_UPDATE packet: "/utf8,
(discord_gleam@internal@error:json_decode_error_to_string(
Err@23
))/binary>>
),
{unknown_packet, Generic_packet}
end;
_ ->
{unknown_packet, Generic_packet}
end;
_ ->
{unknown_packet, Generic_packet}
end.
-file("src/discord_gleam/event_handler.gleam", 244).
?DOC(
" Handle an event from the Discord API, using a current handler mode, state\n"
" and internal message.\n"
).
-spec handle_event(
discord_gleam@bot:bot(),
MNW,
internal_message(MNX),
mode(MNW, MNX),
booklet:booklet(discord_gleam@ws@gateway_state:gateway_state())
) -> next(MNW, MNX).
handle_event(Bot, User_state, Msg, Mode, State_ets) ->
case Msg of
{internal_packet, Packet} ->
Packet@1 = decode_packet(Packet),
internal_handler(Bot, Packet@1, State_ets),
case Mode of
{simple, Bot@1, Handlers, Next, _} ->
gleam@list:each(
Handlers,
fun(Handler) -> Handler(Bot@1, Packet@1) end
),
Next;
{normal, Bot@2, _, _, Handler@1} ->
Handler@1(Bot@2, User_state, {discord_packet, Packet@1})
end;
{internal_user, Msg@1} ->
case Mode of
{normal, Bot@3, _, _, Handler@2} ->
Handler@2(Bot@3, User_state, {user, Msg@1});
_ ->
logging:log(
error,
<<"Received user message in simple mode, ignoring"/utf8>>
),
{continue, User_state, none}
end
end.