@@ -6,9 +6,11 @@ use tokio::time::sleep;
66use twilight_http:: { Client , Error , Response } ;
77use twilight_http:: api_error:: ApiError ;
88use twilight_http:: error:: ErrorType ;
9+ use twilight_model:: channel:: Message ;
10+ use twilight_model:: channel:: message:: Component ;
911use twilight_model:: guild:: { Guild , Member , Role } ;
1012use twilight_model:: id:: Id ;
11- use twilight_model:: id:: marker:: { GuildMarker , RoleMarker , UserMarker } ;
13+ use twilight_model:: id:: marker:: { ChannelMarker , GuildMarker , MessageMarker , RoleMarker , UserMarker } ;
1214use twilight_model:: user:: { CurrentUser , CurrentUserGuild } ;
1315
1416pub fn ise < T : std:: fmt:: Debug > ( e : T ) -> StatusCode {
4648
4749pub fn as_http_err ( e : Error ) -> StatusCode {
4850 match e. kind ( ) {
49- ErrorType :: Response { status, .. } => StatusCode :: from_u16 ( status. get ( ) ) . map_err ( ise) . unwrap ( ) ,
50- _ => StatusCode :: INTERNAL_SERVER_ERROR
51+ ErrorType :: Response { status, error, .. } => {
52+ error ! ( "Discord Api Error: {} {:?}" , status, error) ;
53+ StatusCode :: from_u16 ( status. get ( ) ) . map_err ( ise) . unwrap ( )
54+ } ,
55+ _ => {
56+ error ! ( "Internal Server Error: {:?}" , e) ;
57+ StatusCode :: INTERNAL_SERVER_ERROR
58+ }
5159 }
5260}
5361
@@ -93,3 +101,36 @@ pub async fn get_guild_role(guild_id: Id<GuildMarker>, role_id: Id<RoleMarker>,
93101 retry_on_rl ( || async { client. role ( guild_id, role_id) . await } ) . await . map_err ( as_http_err) ?. model ( ) . await . map_err ( ise)
94102}
95103
104+ pub async fn create_message ( channel_id : Id < ChannelMarker > ,
105+ content : Option < & str > ,
106+ components : Option < & [ Component ] > ,
107+ client : & Client ) -> Result < Message , StatusCode > {
108+ retry_on_rl ( || async {
109+ let mut msg_builder = client. create_message ( channel_id) ;
110+ if let Some ( content) = content {
111+ msg_builder = msg_builder. content ( content) ;
112+ }
113+ if let Some ( components) = components {
114+ msg_builder = msg_builder. components ( components) ;
115+ }
116+ msg_builder. await
117+
118+ } ) . await . map_err ( as_http_err) ?. model ( ) . await . map_err ( ise)
119+ }
120+
121+ pub async fn update_message ( channel_id : Id < ChannelMarker > ,
122+ message_id : Id < MessageMarker > ,
123+ content : Option < Option < & str > > ,
124+ components : Option < Option < & [ Component ] > > ,
125+ client : & Client ) -> Result < Message , StatusCode > {
126+ retry_on_rl ( || async {
127+ let mut msg_builder = client. update_message ( channel_id, message_id) ;
128+ if let Some ( content) = content {
129+ msg_builder = msg_builder. content ( content) ;
130+ }
131+ if let Some ( components) = components {
132+ msg_builder = msg_builder. components ( components) ;
133+ }
134+ msg_builder. await
135+ } ) . await . map_err ( as_http_err) ?. model ( ) . await . map_err ( ise)
136+ }
0 commit comments