-module(discord_gleam@http@users). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/discord_gleam/http/users.gleam"). -export([me/1, create_dm_channel/2, send_direct_message/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. -file("src/discord_gleam/http/users.gleam", 15). ?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@httpc:send(Request) of {ok, Resp} -> case erlang:element(2, Resp) of 200 -> discord_gleam@types@user:from_json_string( erlang:element(4, Resp) ); 429 -> logging:log( error, <<"Failed to get current user: rate limited"/utf8>> ), {error, discord_gleam@http@request:extract_ratelimit_error(Resp)}; _ -> {error, {api_error, erlang:element(2, Resp), erlang:element(4, Resp)}} end; {error, Err} -> logging:log(error, <<"Failed to get current user"/utf8>>), {error, {http_error, Err}} end. -file("src/discord_gleam/http/users.gleam", 44). ?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(), discord_gleam@discord@snowflake:snowflake(discord_gleam@discord@snowflake:user()) ) -> {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, gleam@json:to_string( gleam@json:object( [{<<"recipient_id"/utf8>>, gleam@json:string( discord_gleam@discord@snowflake:to_string(User_id) )}] ) ) ), case gleam@httpc:send(Request) of {ok, Resp} -> case erlang:element(2, Resp) of 200 -> logging:log(debug, <<"DM channel created"/utf8>>), Channel = discord_gleam@types@channel:from_json_string( 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, Err} end; 429 -> logging:log( error, <<"Failed to create DM channel: rate limited"/utf8>> ), {error, discord_gleam@http@request:extract_ratelimit_error(Resp)}; _ -> {error, {api_error, erlang:element(2, Resp), 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/users.gleam", 106). ?DOC(" Creates a DM channel, then sends a message with `send_message()`.\n"). -spec send_direct_message( binary(), discord_gleam@discord@snowflake:snowflake(discord_gleam@discord@snowflake:user()), discord_gleam@types@message:message() ) -> {ok, discord_gleam@types@message_send_response:message_send_response()} | {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} -> discord_gleam@http@channels:send_message( Token, erlang:element(2, Channel@1), Message ); {error, Err} -> logging:log(error, <<"Failed to create DM channel"/utf8>>), {error, Err} end.