-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(MEX) :: {discord_packet, packet()} | {user, MEX}. -type internal_message(MEY) :: {internal_packet, binary()} | {internal_user, MEY}. -type next(MEZ, MFA) :: {continue, MEZ, gleam@option:option(gleam@erlang@process:selector(MFA))} | stop | {stop_abnormal, binary()}. -type mode(MFB, MFC) :: {simple, discord_gleam@bot:bot(), list(fun((discord_gleam@bot:bot(), packet()) -> nil)), next(MFB, MFC), MFB} | {normal, discord_gleam@bot:bot(), gleam@erlang@process:name(MFC), fun((gleam@erlang@process:selector(MFC)) -> {MFB, gleam@erlang@process:selector(MFC)}), fun((discord_gleam@bot:bot(), MFB, handler_message(MFC)) -> next(MFB, MFC))}. -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()} | {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_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", 85). ?DOC(" Check if the mode is normal mode\n"). -spec name_from_mode(mode(any(), MFE)) -> {ok, gleam@erlang@process:name(MFE)} | {error, nil}. name_from_mode(Mode) -> case Mode of {normal, _, Name, _, _} -> {ok, Name}; {simple, _, _, _, _} -> {error, nil} end. -file("src/discord_gleam/event_handler.gleam", 95). ?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", 102). -spec set_bot(mode(MFO, MFP), discord_gleam@bot:bot()) -> mode(MFO, MFP). 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", 167). -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", 195). ?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", 274). -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; <<"INTERACTION_CREATE"/utf8>> -> case discord_gleam@ws@packets@interaction_create:from_json_string( Msg ) of {ok, Packet@5} -> {interaction_create_packet, erlang:element(5, Packet@5)}; {error, Err@5} -> logging:log( error, <<"Failed to decode INTERACTION_CREATE packet: "/utf8, (discord_gleam@internal@error:json_decode_error_to_string( Err@5 ))/binary>> ), {unknown_packet, Generic_packet} end; <<"CHANNEL_CREATE"/utf8>> -> case discord_gleam@ws@packets@channel_create:from_json_string( Msg ) of {ok, Packet@6} -> {channel_create_packet, erlang:element(5, Packet@6)}; {error, Err@6} -> logging:log( error, <<"Failed to decode CHANNEL_CREATE packet: "/utf8, (discord_gleam@internal@error:json_decode_error_to_string( Err@6 ))/binary>> ), {unknown_packet, Generic_packet} end; <<"CHANNEL_DELETE"/utf8>> -> case discord_gleam@ws@packets@channel_delete:from_json_string( Msg ) of {ok, Packet@7} -> {channel_delete_packet, erlang:element(5, Packet@7)}; {error, Err@7} -> logging:log( error, <<"Failed to decode CHANNEL_DELETE packet: "/utf8, (discord_gleam@internal@error:json_decode_error_to_string( Err@7 ))/binary>> ), {unknown_packet, Generic_packet} end; <<"CHANNEL_UPDATE"/utf8>> -> case discord_gleam@ws@packets@channel_update:from_json_string( Msg ) of {ok, Packet@8} -> {channel_update_packet, erlang:element(5, Packet@8)}; {error, Err@8} -> logging:log( error, <<"Failed to decode CHANNEL_UPDATE packet: "/utf8, (discord_gleam@internal@error:json_decode_error_to_string( Err@8 ))/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@9} -> {guild_ban_add_packet, erlang:element(5, Packet@9)}; {error, Err@9} -> logging:log( error, <<"Failed to decode GUILD_BAN_ADD packet: "/utf8, (discord_gleam@internal@error:json_decode_error_to_string( Err@9 ))/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@10} -> {guild_ban_remove_packet, erlang:element(5, Packet@10)}; {error, Err@10} -> logging:log( error, <<"Failed to decode GUILD_BAN_REMOVE packet: "/utf8, (discord_gleam@internal@error:json_decode_error_to_string( Err@10 ))/binary>> ), {unknown_packet, Generic_packet} end; <<"GUILD_CREATE"/utf8>> -> case discord_gleam@ws@packets@guild_create:from_json_string( Msg ) of {ok, Packet@11} -> {guild_create_packet, erlang:element(5, Packet@11)}; {error, Err@11} -> logging:log( error, <<"Failed to decode GUILD_CREATE packet: "/utf8, (discord_gleam@internal@error:json_decode_error_to_string( Err@11 ))/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@12} -> {guild_role_create_packet, erlang:element(5, Packet@12)}; {error, Err@12} -> logging:log( error, <<"Failed to decode GUILD_ROLE_CREATE packet: "/utf8, (discord_gleam@internal@error:json_decode_error_to_string( Err@12 ))/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@13} -> {guild_role_update_packet, erlang:element(5, Packet@13)}; {error, Err@13} -> logging:log( error, <<"Failed to decode GUILD_ROLE_UPDATE packet: "/utf8, (discord_gleam@internal@error:json_decode_error_to_string( Err@13 ))/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@14} -> {guild_role_delete_packet, erlang:element(5, Packet@14)}; {error, Err@14} -> logging:log( error, <<"Failed to decode GUILD_ROLE_DELETE packet: "/utf8, (discord_gleam@internal@error:json_decode_error_to_string( Err@14 ))/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@15} -> {guild_member_add_packet, erlang:element(5, Packet@15)}; {error, Err@15} -> logging:log( error, <<"Failed to decode GUILD_MEMBER_ADD packet: "/utf8, (discord_gleam@internal@error:json_decode_error_to_string( Err@15 ))/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@16} -> {guild_member_update_packet, erlang:element(5, Packet@16)}; {error, Err@16} -> logging:log( error, <<"Failed to decode GUILD_MEMBER_UPDATE packet: "/utf8, (discord_gleam@internal@error:json_decode_error_to_string( Err@16 ))/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@17} -> {guild_member_remove_packet, erlang:element(5, Packet@17)}; {error, Err@17} -> logging:log( error, <<"Failed to decode GUILD_MEMBER_REMOVE packet: "/utf8, (discord_gleam@internal@error:json_decode_error_to_string( Err@17 ))/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@18} -> {guild_members_chunk_packet, erlang:element(5, Packet@18)}; {error, Err@18} -> logging:log( error, <<"Failed to decode GUILD_MEMBERS_CHUNK packet: "/utf8, (discord_gleam@internal@error:json_decode_error_to_string( Err@18 ))/binary>> ), {unknown_packet, Generic_packet} end; <<"PRESENCE_UPDATE"/utf8>> -> case discord_gleam@ws@packets@presence_update:from_json_string( Msg ) of {ok, Packet@19} -> {presence_update_packet, erlang:element(5, Packet@19)}; {error, Err@19} -> logging:log( error, <<"Failed to decode PRESENCE_UPDATE packet: "/utf8, (discord_gleam@internal@error:json_decode_error_to_string( Err@19 ))/binary>> ), {unknown_packet, Generic_packet} end; _ -> {unknown_packet, Generic_packet} end; _ -> {unknown_packet, Generic_packet} end. -file("src/discord_gleam/event_handler.gleam", 231). ?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(), MFV, internal_message(MFW), mode(MFV, MFW), booklet:booklet(discord_gleam@ws@gateway_state:gateway_state()) ) -> next(MFV, MFW). 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.