Current section

Files

Jump to
discord_gleam src discord_gleam@http@endpoints.erl
Raw

src/discord_gleam@http@endpoints.erl

-module(discord_gleam@http@endpoints).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([me/1, send_message/3, create_dm_channel/2, send_direct_message/3, reply/3, kick_member/4, ban_member/4, delete_message/4, edit_message/4, wipe_global_commands/2, wipe_guild_commands/3, register_global_command/3, register_guild_command/4, interaction_send_text/3]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(
" Low-level functions for interacting with the Discord API. \\\n"
" Preferrably use the higher-level functions in src/discord_gleam.gleam.\n"
).
-file("src/discord_gleam/http/endpoints.gleam", 22).
?DOC(" Get the current user\n").
-spec me(binary()) -> {ok, discord_gleam@types@user:user()} |
{error, discord_gleam@internal@error:discord_error()}.
me(Token) ->
Request = discord_gleam@http@request:new_auth(
get,
<<"/users/@me"/utf8>>,
Token
),
case gleam@hackney:send(Request) of
{ok, Resp} ->
case gleam@http@response:get_header(Resp, <<"content-type"/utf8>>) of
{ok, <<"application/json"/utf8>>} ->
discord_gleam@types@user:from_json_string(
erlang:element(4, Resp)
);
_ ->
{error,
{invalid_format,
{decode_error,
<<"application/json content-type"/utf8>>,
<<"unknown"/utf8>>,
[]}}}
end;
{error, Err} ->
logging:log(error, <<"Failed to get current user"/utf8>>),
{error, {http_error, Err}}
end.
-file("src/discord_gleam/http/endpoints.gleam", 52).
?DOC(" Send a message to a channel\n").
-spec send_message(binary(), binary(), discord_gleam@types@message:message()) -> {ok,
discord_gleam@types@message_send_response:message_send_response()} |
{error, discord_gleam@internal@error:discord_error()}.
send_message(Token, Channel_id, Message) ->
Data = discord_gleam@types@message:to_string(Message),
logging:log(debug, <<"Sending message: "/utf8, Data/binary>>),
Request = discord_gleam@http@request:new_auth_with_body(
post,
<<<<"/channels/"/utf8, Channel_id/binary>>/binary, "/messages"/utf8>>,
Token,
Data
),
case gleam@hackney:send(Request) of
{ok, Resp} ->
case erlang:element(2, Resp) of
200 ->
logging:log(debug, <<"Message sent"/utf8>>),
discord_gleam@types@message_send_response:from_json_string(
erlang:element(4, Resp)
);
_ ->
logging:log(error, <<"Failed to send message"/utf8>>),
{error,
{generic_http_error,
erlang:element(2, Resp),
erlang:element(4, Resp)}}
end;
{error, Err} ->
logging:log(error, <<"Failed to send message"/utf8>>),
{error, {http_error, Err}}
end.
-file("src/discord_gleam/http/endpoints.gleam", 98).
?DOC(" Create a DM channel, can be used to send direct messages where a direct message function is not created\n").
-spec create_dm_channel(binary(), binary()) -> {ok,
discord_gleam@types@channel:channel()} |
{error, discord_gleam@internal@error:discord_error()}.
create_dm_channel(Token, User_id) ->
Request = discord_gleam@http@request:new_auth_with_body(
post,
<<"/users/@me/channels"/utf8>>,
Token,
<<<<"{ \"recipient_id\": \""/utf8, User_id/binary>>/binary,
"\" }"/utf8>>
),
case gleam@hackney:send(Request) of
{ok, Resp} ->
case erlang:element(2, Resp) of
200 ->
logging:log(debug, <<"DM channel created"/utf8>>),
Channel = discord_gleam@types@channel:string_to_data(
erlang:element(4, Resp)
),
case Channel of
{ok, Channel@1} ->
{ok, Channel@1};
{error, Err} ->
logging:log(
error,
<<"Failed to decode DM channel"/utf8>>
),
{error, {json_decode_error, Err}}
end;
V ->
{error, {generic_http_error, V, erlang:element(4, Resp)}}
end;
{error, Err@1} ->
logging:log(error, <<"Failed to create DM channel"/utf8>>),
{error, {http_error, Err@1}}
end.
-file("src/discord_gleam/http/endpoints.gleam", 147).
?DOC(" Creates a DM channel, then sends a message with `send_message()`.\n").
-spec send_direct_message(
binary(),
binary(),
discord_gleam@types@message:message()
) -> {ok, nil} | {error, discord_gleam@internal@error:discord_error()}.
send_direct_message(Token, User_id, Message) ->
Data = discord_gleam@types@message:to_string(Message),
logging:log(debug, <<"Sending DM: "/utf8, Data/binary>>),
Channel = create_dm_channel(Token, User_id),
case Channel of
{ok, Channel@1} ->
_ = send_message(Token, erlang:element(2, Channel@1), Message),
{ok, nil};
{error, Err} ->
logging:log(error, <<"Failed to create DM channel"/utf8>>),
{error, Err}
end.
-file("src/discord_gleam/http/endpoints.gleam", 174).
?DOC(" Reply to a message\n").
-spec reply(binary(), binary(), discord_gleam@types@reply:reply()) -> {ok, nil} |
{error, discord_gleam@internal@error:discord_error()}.
reply(Token, Channel_id, Message) ->
Data = discord_gleam@types@reply:to_string(Message),
logging:log(debug, <<"Replying: "/utf8, Data/binary>>),
Request = discord_gleam@http@request:new_auth_with_body(
post,
<<<<"/channels/"/utf8, Channel_id/binary>>/binary, "/messages"/utf8>>,
Token,
Data
),
case gleam@hackney:send(Request) of
{ok, Resp} ->
case erlang:element(2, Resp) of
200 ->
logging:log(debug, <<"Reply sent"/utf8>>),
{ok, nil};
_ ->
logging:log(error, <<"Failed to send reply"/utf8>>),
{error,
{generic_http_error,
erlang:element(2, Resp),
erlang:element(4, Resp)}}
end;
{error, Err} ->
logging:log(error, <<"Failed to send reply"/utf8>>),
{error, {http_error, Err}}
end.
-file("src/discord_gleam/http/endpoints.gleam", 218).
?DOC(" Kick a member from a server\n").
-spec kick_member(binary(), binary(), binary(), binary()) -> {ok, nil} |
{error, discord_gleam@internal@error:discord_error()}.
kick_member(Token, Guild_id, User_id, Reason) ->
Request = discord_gleam@http@request:new_auth_with_header(
delete,
<<<<<<"/guilds/"/utf8, Guild_id/binary>>/binary, "/members/"/utf8>>/binary,
User_id/binary>>,
Token,
{<<"X-Audit-Log-Reason"/utf8>>, Reason}
),
case gleam@hackney:send(Request) of
{ok, Resp} ->
case erlang:element(2, Resp) of
204 ->
logging:log(debug, <<"Kicked member"/utf8>>),
{ok, nil};
_ ->
logging:log(error, <<"Failed to kick member"/utf8>>),
{error,
{generic_http_error,
erlang:element(2, Resp),
erlang:element(4, Resp)}}
end;
{error, Err} ->
logging:log(error, <<"Failed to kick member"/utf8>>),
{error, {http_error, Err}}
end.
-file("src/discord_gleam/http/endpoints.gleam", 260).
?DOC(" Ban a member from a server\n").
-spec ban_member(binary(), binary(), binary(), binary()) -> {ok, nil} |
{error, discord_gleam@internal@error:discord_error()}.
ban_member(Token, Guild_id, User_id, Reason) ->
Request = discord_gleam@http@request:new_auth_with_header(
put,
<<<<<<"/guilds/"/utf8, Guild_id/binary>>/binary, "/bans/"/utf8>>/binary,
User_id/binary>>,
Token,
{<<"X-Audit-Log-Reason"/utf8>>, Reason}
),
case gleam@hackney:send(Request) of
{ok, Resp} ->
case erlang:element(2, Resp) of
204 ->
logging:log(debug, <<"Banned member"/utf8>>),
{ok, nil};
_ ->
logging:log(error, <<"Failed to ban member"/utf8>>),
{error,
{generic_http_error,
erlang:element(2, Resp),
erlang:element(4, Resp)}}
end;
{error, Err} ->
logging:log(error, <<"Failed to ban member: "/utf8>>),
{error, {http_error, Err}}
end.
-file("src/discord_gleam/http/endpoints.gleam", 301).
?DOC(" Delete a message by channel id and message id\n").
-spec delete_message(binary(), binary(), binary(), binary()) -> {ok, nil} |
{error, discord_gleam@internal@error:discord_error()}.
delete_message(Token, Channel_id, Message_id, Reason) ->
Request = discord_gleam@http@request:new_auth_with_header(
delete,
<<<<<<"/channels/"/utf8, Channel_id/binary>>/binary, "/messages/"/utf8>>/binary,
Message_id/binary>>,
Token,
{<<"X-Audit-Log-Reason"/utf8>>, Reason}
),
case gleam@hackney:send(Request) of
{ok, Resp} ->
case erlang:element(2, Resp) of
204 ->
logging:log(debug, <<"Deleted Message"/utf8>>),
{ok, nil};
_ ->
logging:log(error, <<"Failed to delete message"/utf8>>),
{error,
{generic_http_error,
erlang:element(2, Resp),
erlang:element(4, Resp)}}
end;
{error, Err} ->
logging:log(error, <<"Failed to delete message"/utf8>>),
{error, {http_error, Err}}
end.
-file("src/discord_gleam/http/endpoints.gleam", 342).
?DOC(" Edit an message by channel id and message id\n").
-spec edit_message(
binary(),
binary(),
binary(),
discord_gleam@types@message:message()
) -> {ok, nil} | {error, discord_gleam@internal@error:discord_error()}.
edit_message(Token, Channel_id, Message_id, Message) ->
Data = discord_gleam@types@message:to_string(Message),
logging:log(debug, <<"Editing message: "/utf8, Data/binary>>),
Request = discord_gleam@http@request:new_auth_with_body(
patch,
<<<<<<"/channels/"/utf8, Channel_id/binary>>/binary, "/messages/"/utf8>>/binary,
Message_id/binary>>,
Token,
Data
),
case gleam@hackney:send(Request) of
{ok, Resp} ->
case erlang:element(2, Resp) of
200 ->
logging:log(debug, <<"Message edited"/utf8>>),
{ok, nil};
_ ->
logging:log(error, <<"Failed to edit message"/utf8>>),
gleam@io:debug(erlang:element(4, Resp)),
{error,
{generic_http_error,
erlang:element(2, Resp),
erlang:element(4, Resp)}}
end;
{error, Err} ->
logging:log(error, <<"Failed to edit message: "/utf8>>),
gleam@io:debug(Err),
{error, {http_error, Err}}
end.
-file("src/discord_gleam/http/endpoints.gleam", 390).
?DOC(" Wipes the global commands for the bot\n").
-spec wipe_global_commands(binary(), binary()) -> {ok, nil} |
{error, discord_gleam@internal@error:discord_error()}.
wipe_global_commands(Token, Client_id) ->
Request = discord_gleam@http@request:new_auth_with_body(
put,
<<<<"/applications/"/utf8, Client_id/binary>>/binary, "/commands"/utf8>>,
Token,
<<"{}"/utf8>>
),
case gleam@hackney:send(Request) of
{ok, Resp} ->
case erlang:element(2, Resp) of
200 ->
logging:log(debug, <<"Wiped global commands"/utf8>>),
{ok, nil};
_ ->
logging:log(
error,
<<"Failed to wipe global commands"/utf8>>
),
{error,
{generic_http_error,
erlang:element(2, Resp),
erlang:element(4, Resp)}}
end;
{error, Err} ->
logging:log(error, <<"Failed to wipe global commands"/utf8>>),
{error, {http_error, Err}}
end.
-file("src/discord_gleam/http/endpoints.gleam", 429).
?DOC(" Wipes the guild commands for the bot\n").
-spec wipe_guild_commands(binary(), binary(), binary()) -> {ok, nil} |
{error, discord_gleam@internal@error:discord_error()}.
wipe_guild_commands(Token, Client_id, Guild_id) ->
Request = discord_gleam@http@request:new_auth_with_body(
put,
<<<<<<<<"/applications/"/utf8, Client_id/binary>>/binary,
"/guilds/"/utf8>>/binary,
Guild_id/binary>>/binary,
"/commands"/utf8>>,
Token,
<<"{}"/utf8>>
),
case gleam@hackney:send(Request) of
{ok, Resp} ->
case erlang:element(2, Resp) of
200 ->
logging:log(debug, <<"Wiped guild commands"/utf8>>),
{ok, nil};
_ ->
logging:log(error, <<"Failed to wipe guild commands"/utf8>>),
{error,
{generic_http_error,
erlang:element(2, Resp),
erlang:element(4, Resp)}}
end;
{error, Err} ->
logging:log(error, <<"Failed to wipe guild commands"/utf8>>),
{error, {http_error, Err}}
end.
-file("src/discord_gleam/http/endpoints.gleam", 469).
?DOC(" Register a new global slash command\n").
-spec register_global_command(
binary(),
binary(),
discord_gleam@types@slash_command:slash_command()
) -> {ok, nil} | {error, discord_gleam@internal@error:discord_error()}.
register_global_command(Token, Client_id, Command) ->
Request = discord_gleam@http@request:new_auth_with_body(
post,
<<<<"/applications/"/utf8, Client_id/binary>>/binary, "/commands"/utf8>>,
Token,
discord_gleam@types@slash_command:command_to_string(Command)
),
case gleam@hackney:send(Request) of
{ok, Resp} ->
case erlang:element(2, Resp) of
201 ->
logging:log(
debug,
<<"Added global command "/utf8,
(erlang:element(2, Command))/binary>>
),
{ok, nil};
200 ->
logging:log(
debug,
<<"Updated global command "/utf8,
(erlang:element(2, Command))/binary>>
),
{ok, nil};
_ ->
logging:log(
error,
<<"Failed to add global command "/utf8,
(erlang:element(2, Command))/binary>>
),
{error,
{generic_http_error,
erlang:element(2, Resp),
erlang:element(4, Resp)}}
end;
{error, Err} ->
logging:log(
error,
<<"Failed to add global command "/utf8,
(erlang:element(2, Command))/binary>>
),
{error, {http_error, Err}}
end.
-file("src/discord_gleam/http/endpoints.gleam", 523).
?DOC(" Register a new guild-specific slash command\n").
-spec register_guild_command(
binary(),
binary(),
binary(),
discord_gleam@types@slash_command:slash_command()
) -> {ok, nil} | {error, discord_gleam@internal@error:discord_error()}.
register_guild_command(Token, Client_id, Guild_id, Command) ->
Request = discord_gleam@http@request:new_auth_with_body(
post,
<<<<<<<<"/applications/"/utf8, Client_id/binary>>/binary,
"/guilds/"/utf8>>/binary,
Guild_id/binary>>/binary,
"/commands"/utf8>>,
Token,
discord_gleam@types@slash_command:command_to_string(Command)
),
case gleam@hackney:send(Request) of
{ok, Resp} ->
case erlang:element(2, Resp) of
201 ->
logging:log(
debug,
<<"Added guild command "/utf8,
(erlang:element(2, Command))/binary>>
),
{ok, nil};
200 ->
logging:log(
debug,
<<"Updated guild command "/utf8,
(erlang:element(2, Command))/binary>>
),
{ok, nil};
_ ->
logging:log(
error,
<<"Failed to add guild command "/utf8,
(erlang:element(2, Command))/binary>>
),
{error,
{generic_http_error,
erlang:element(2, Resp),
erlang:element(4, Resp)}}
end;
{error, Err} ->
logging:log(
error,
<<"Failed to add guild command "/utf8,
(erlang:element(2, Command))/binary>>
),
{error, {http_error, Err}}
end.
-file("src/discord_gleam/http/endpoints.gleam", 574).
?DOC(" Send a basic text reply to an interaction\n").
-spec interaction_send_text(
discord_gleam@ws@packets@interaction_create:interaction_create(),
binary(),
boolean()
) -> {ok, nil} | {error, discord_gleam@internal@error:discord_error()}.
interaction_send_text(Interaction, Message, Ephemeral) ->
Request = discord_gleam@http@request:new_with_body(
post,
<<<<<<<<"/interactions/"/utf8,
(erlang:element(4, erlang:element(5, Interaction)))/binary>>/binary,
"/"/utf8>>/binary,
(erlang:element(2, erlang:element(5, Interaction)))/binary>>/binary,
"/callback"/utf8>>,
discord_gleam@types@slash_command:make_basic_text_reply(
Message,
Ephemeral
)
),
case gleam@hackney:send(Request) of
{ok, Resp} ->
case erlang:element(2, Resp) of
204 ->
logging:log(debug, <<"Sent Interaction Response"/utf8>>),
{ok, nil};
_ ->
logging:log(
error,
<<"Failed to send Interaction Response"/utf8>>
),
{error,
{generic_http_error,
erlang:element(2, Resp),
erlang:element(4, Resp)}}
end;
{error, Err} ->
logging:log(
error,
<<"Error when sending Interaction Response"/utf8>>
),
{error, {http_error, Err}}
end.