16
16
use super :: utils:: { as_snowflake, get_snowflake, to_reactions, DiscordMessage } ;
17
17
use crate :: channel:: { Receiver , Sender } ;
18
18
use serenity:: {
19
+ all:: { CreateEmbed , CreateEmbedAuthor , CreateEmbedFooter , CreateMessage , EditMember } ,
19
20
model:: {
20
- channel:: { Channel , ChannelCategory , GuildChannel , Message , Reaction } ,
21
+ channel:: { GuildChannel , Message , Reaction } ,
21
22
event:: {
22
- ChannelPinsUpdateEvent , GuildMembersChunkEvent , ResumedEvent , TypingStartEvent ,
23
- VoiceServerUpdateEvent ,
23
+ ChannelPinsUpdateEvent , GuildMemberUpdateEvent , GuildMembersChunkEvent , ResumedEvent ,
24
+ TypingStartEvent , VoiceServerUpdateEvent ,
24
25
} ,
25
26
guild:: { Emoji , Guild , Member , PartialGuild , Role } ,
26
27
id:: { ChannelId , EmojiId , GuildId , MessageId , RoleId , UserId } ,
@@ -29,6 +30,7 @@ use serenity::{
29
30
} ,
30
31
prelude:: * ,
31
32
} ;
33
+ use simd_json:: prelude:: ValueObjectAccess ;
32
34
use std:: collections:: HashMap ;
33
35
use tokio:: task;
34
36
use tremor_value:: { prelude:: * , to_value} ;
@@ -57,6 +59,7 @@ impl Handler {
57
59
}
58
60
}
59
61
}
62
+
60
63
#[ async_trait:: async_trait]
61
64
impl EventHandler for Handler {
62
65
// We use the cache_ready event just in case some cache operation is required in whatever use
@@ -71,23 +74,17 @@ impl EventHandler for Handler {
71
74
}
72
75
}
73
76
74
- async fn channel_create ( & self , _ctx : Context , channel : & GuildChannel ) {
75
- self . forward ( DiscordMessage :: ChannelCreate ( channel. clone ( ) ) )
76
- . await ;
77
- }
78
-
79
- async fn category_create ( & self , _ctx : Context , category : & ChannelCategory ) {
80
- self . forward ( DiscordMessage :: CategoryCreate ( category. clone ( ) ) )
81
- . await ;
77
+ async fn channel_create ( & self , _ctx : Context , channel : GuildChannel ) {
78
+ self . forward ( DiscordMessage :: ChannelCreate ( channel) ) . await ;
82
79
}
83
80
84
- async fn category_delete ( & self , _ctx : Context , category : & ChannelCategory ) {
85
- self . forward ( DiscordMessage :: CategoryDelete ( category . clone ( ) ) )
86
- . await ;
87
- }
88
-
89
- async fn channel_delete ( & self , _ctx : Context , channel : & GuildChannel ) {
90
- self . forward ( DiscordMessage :: ChannelDelete ( channel. clone ( ) ) )
81
+ async fn channel_delete (
82
+ & self ,
83
+ _ctx : Context ,
84
+ channel : GuildChannel ,
85
+ maybe_message : Option < Vec < Message > > ,
86
+ ) {
87
+ self . forward ( DiscordMessage :: ChannelDelete ( channel, maybe_message ) )
91
88
. await ;
92
89
}
93
90
@@ -133,7 +130,7 @@ impl EventHandler for Handler {
133
130
self . forward ( DiscordMessage :: TypingStart ( e) ) . await ;
134
131
}
135
132
136
- async fn channel_update ( & self , _ctx : Context , old : Option < Channel > , new : Channel ) {
133
+ async fn channel_update ( & self , _ctx : Context , old : Option < GuildChannel > , new : GuildChannel ) {
137
134
self . forward ( DiscordMessage :: ChannelUpdate { old, new } )
138
135
. await ;
139
136
}
@@ -148,7 +145,7 @@ impl EventHandler for Handler {
148
145
. await ;
149
146
}
150
147
151
- async fn guild_create ( & self , _ctx : Context , guild : Guild , is_new : bool ) {
148
+ async fn guild_create ( & self , _ctx : Context , guild : Guild , is_new : Option < bool > ) {
152
149
self . forward ( DiscordMessage :: GuildCreate { guild, is_new } )
153
150
. await ;
154
151
}
@@ -200,11 +197,13 @@ impl EventHandler for Handler {
200
197
& self ,
201
198
_ctx : Context ,
202
199
old_if_available : Option < Member > ,
203
- new : Member ,
200
+ member : Option < Member > ,
201
+ event : GuildMemberUpdateEvent ,
204
202
) {
205
203
self . forward ( DiscordMessage :: MemberUpdate {
206
204
old_if_available,
207
- new,
205
+ member,
206
+ event,
208
207
} )
209
208
. await ;
210
209
}
@@ -245,11 +244,6 @@ impl EventHandler for Handler {
245
244
. await ;
246
245
}
247
246
248
- async fn guild_unavailable ( & self , _ctx : Context , guild_id : GuildId ) {
249
- self . forward ( DiscordMessage :: GuildUnavailable ( guild_id) )
250
- . await ;
251
- }
252
-
253
247
async fn guild_update (
254
248
& self ,
255
249
_ctx : Context ,
@@ -325,9 +319,17 @@ impl EventHandler for Handler {
325
319
self . forward ( DiscordMessage :: Resume ( resume) ) . await ;
326
320
}
327
321
328
- async fn user_update ( & self , _ctx : Context , old_data : CurrentUser , new : CurrentUser ) {
329
- self . forward ( DiscordMessage :: UserUpdate { old_data, new } )
322
+ async fn user_update ( & self , _ctx : Context , old_data : Option < CurrentUser > , new : CurrentUser ) {
323
+ if let Some ( old_data) = old_data {
324
+ self . forward ( DiscordMessage :: UserUpdate { old_data, new } )
325
+ . await ;
326
+ } else {
327
+ self . forward ( DiscordMessage :: UserUpdate {
328
+ old_data : new. clone ( ) ,
329
+ new,
330
+ } )
330
331
. await ;
332
+ }
331
333
}
332
334
333
335
async fn voice_server_update ( & self , _ctx : Context , update : VoiceServerUpdateEvent ) {
@@ -358,16 +360,16 @@ async fn reply_loop(mut rx: Receiver<Value<'static>>, ctx: Context) {
358
360
while let Some ( reply) = rx. recv ( ) . await {
359
361
if let Some ( reply) = reply. get ( "guild" ) {
360
362
let guild = if let Some ( id) = get_snowflake ( reply, "id" ) {
361
- GuildId ( id)
363
+ GuildId :: new ( id)
362
364
} else {
363
365
error ! ( "guild `id` missing" ) ;
364
366
continue ;
365
367
} ;
366
368
367
369
if let Some ( member) = reply. get ( "member" ) {
368
370
if let Some ( id) = get_snowflake ( member, "id" ) {
369
- let user = UserId ( id) ;
370
- let mut current_member = match guild. member ( & ctx, user) . await {
371
+ let user = UserId :: new ( id) ;
372
+ let current_member = match guild. member ( & ctx, user) . await {
371
373
Ok ( current_member) => current_member,
372
374
Err ( e) => {
373
375
error ! ( "Member error: {}" , e) ;
@@ -377,7 +379,7 @@ async fn reply_loop(mut rx: Receiver<Value<'static>>, ctx: Context) {
377
379
if let Some ( to_remove) = member. get_array ( "remove_roles" ) {
378
380
let to_remove: Vec < _ > = to_remove
379
381
. iter ( )
380
- . filter_map ( |v| as_snowflake ( v) . map ( RoleId ) )
382
+ . filter_map ( |v| as_snowflake ( v) . map ( RoleId :: new ) )
381
383
. collect ( ) ;
382
384
if let Err ( e) = current_member. remove_roles ( & ctx, & to_remove) . await {
383
385
error ! ( "Role removal error: {}" , e) ;
@@ -387,24 +389,20 @@ async fn reply_loop(mut rx: Receiver<Value<'static>>, ctx: Context) {
387
389
if let Some ( to_roles) = member. get_array ( "add_roles" ) {
388
390
let to_roles: Vec < _ > = to_roles
389
391
. iter ( )
390
- . filter_map ( |v| as_snowflake ( v) . map ( RoleId ) )
392
+ . filter_map ( |v| as_snowflake ( v) . map ( RoleId :: new ) )
391
393
. collect ( ) ;
392
394
if let Err ( e) = current_member. add_roles ( & ctx, & to_roles) . await {
393
395
error ! ( "Role add error: {}" , e) ;
394
396
} ;
395
397
}
396
- let r = guild
397
- . edit_member ( & ctx, id, |m| {
398
- if let Some ( deafen) = member. get_bool ( "deafen" ) {
399
- m. deafen ( deafen) ;
400
- }
401
- if let Some ( mute) = member. get_bool ( "mute" ) {
402
- m. mute ( mute) ;
403
- }
404
-
405
- m
406
- } )
407
- . await ;
398
+ let mut em = EditMember :: default ( ) ;
399
+ if let Some ( mute) = member. get_bool ( "mute" ) {
400
+ em = em. mute ( mute) ;
401
+ } ;
402
+ if let Some ( deaf) = member. get_bool ( "deaf" ) {
403
+ em = em. deafen ( deaf) ;
404
+ } ;
405
+ let r = guild. edit_member ( & ctx, id, em) . await ;
408
406
if let Err ( e) = r {
409
407
error ! ( "Mute/Deafen error: {}" , e) ;
410
408
} ;
@@ -413,7 +411,7 @@ async fn reply_loop(mut rx: Receiver<Value<'static>>, ctx: Context) {
413
411
}
414
412
if let Some ( reply) = reply. get ( "message" ) {
415
413
let channel = if let Some ( id) = get_snowflake ( reply, "channel_id" ) {
416
- ChannelId ( id)
414
+ ChannelId :: new ( id)
417
415
} else {
418
416
error ! ( "channel_id missing" ) ;
419
417
continue ;
@@ -440,84 +438,67 @@ async fn reply_loop(mut rx: Receiver<Value<'static>>, ctx: Context) {
440
438
}
441
439
442
440
if let Some ( reply) = reply. get ( "send" ) {
443
- if let Err ( e) = channel
444
- . send_message ( & ctx, |m| {
445
- // Normal content
446
- if let Some ( content) = reply. get_str ( "content" ) {
447
- m. content ( content) ;
448
- } ;
449
- // Reference to another message
450
- if let Some ( reference_message) = get_snowflake ( reply, "reference_message" ) {
451
- let reference_channel = get_snowflake ( reply, "reference_channel" )
452
- . map_or ( channel, ChannelId ) ;
453
- m. reference_message ( ( reference_channel, MessageId ( reference_message) ) ) ;
454
- } ;
455
-
456
- if let Some ( tts) = reply. get_bool ( "tts" ) {
457
- m. tts ( tts) ;
458
- } ;
459
-
460
- if let Some ( embed) = reply. get ( "embed" ) {
461
- m. embed ( |e| {
462
- if let Some ( author) = embed. get ( "author" ) {
463
- e. author ( |a| {
464
- if let Some ( icon_url) = author. get_str ( "icon_url" ) {
465
- a. icon_url ( icon_url) ;
466
- } ;
467
- if let Some ( name) = author. get_str ( "name" ) {
468
- a. name ( name) ;
469
- } ;
470
- if let Some ( url) = author. get_str ( "url" ) {
471
- a. url ( url) ;
472
- } ;
473
-
474
- a
475
- } ) ;
476
- } ;
477
-
478
- if let Some ( colour) = embed. get_u64 ( "colour" ) {
479
- e. colour ( colour) ;
480
- } ;
481
- if let Some ( description) = embed. get_str ( "description" ) {
482
- e. description ( description) ;
483
- } ;
484
-
485
- if let Some ( fields) = embed. get_array ( "fields" ) {
486
- e. fields ( fields. iter ( ) . filter_map ( |v| {
487
- let name = v. get_str ( "name" ) ?;
488
- let value = v. get_str ( "value" ) ?;
489
- let inline = v. get_bool ( "inline" ) . unwrap_or_default ( ) ;
490
- Some ( ( name, value, inline) )
491
- } ) ) ;
492
- } ;
493
- if let Some ( footer) = embed. get ( "footer" ) {
494
- e. footer ( |f| {
495
- if let Some ( text) = footer. as_str ( ) {
496
- f. text ( text) ;
497
- } ;
498
- if let Some ( text) = footer. get_str ( "text" ) {
499
- f. text ( text) ;
500
- } ;
501
- if let Some ( icon_url) = footer. get_str ( "icon_url" ) {
502
- f. icon_url ( icon_url) ;
503
- } ;
504
-
505
- f
506
- } ) ;
507
- } ;
508
-
509
- e
510
- } ) ;
511
- } ;
512
-
513
- if let Some ( reactions) = reply. get ( "reactions" ) . and_then ( to_reactions) {
514
- m. reactions ( reactions) ;
441
+ let mut created_message = CreateMessage :: default ( ) ;
442
+ // Normal content
443
+ if let Some ( content) = reply. get_str ( "content" ) {
444
+ created_message = created_message. content ( content) ;
445
+ } ;
446
+ // Reference to another message
447
+ if let Some ( reference_message) = get_snowflake ( reply, "reference_message" ) {
448
+ let reference_channel =
449
+ get_snowflake ( reply, "reference_channel" ) . map_or ( channel, ChannelId :: new) ;
450
+ created_message = created_message
451
+ . reference_message ( ( reference_channel, MessageId :: new ( reference_message) ) ) ;
452
+ } ;
453
+ if let Some ( tts) = reply. get_bool ( "tts" ) {
454
+ created_message = created_message. tts ( tts) ;
455
+ } ;
456
+ if let Some ( embed) = reply. get ( "embed" ) {
457
+ let mut created_embed = CreateEmbed :: default ( ) ;
458
+ if let Some ( author) = embed. get ( "author" ) {
459
+ if let Some ( name) = author. get_str ( "name" ) {
460
+ let mut create_embed_author = CreateEmbedAuthor :: new ( name) ;
461
+ if let Some ( icon_url) = author. get_str ( "icon_url" ) {
462
+ create_embed_author = create_embed_author. icon_url ( icon_url) ;
463
+ } ;
464
+ if let Some ( url) = author. get_str ( "url" ) {
465
+ create_embed_author = create_embed_author. url ( url) ;
466
+ } ;
467
+ created_embed = created_embed. author ( create_embed_author) ;
468
+ }
469
+ } ;
470
+ if let Some ( colour) = embed. get_u64 ( "colour" ) {
471
+ created_embed = created_embed. colour ( colour) ;
472
+ } ;
473
+ if let Some ( description) = embed. get_str ( "description" ) {
474
+ created_embed = created_embed. description ( description) ;
475
+ } ;
476
+ if let Some ( fields) = embed. get_array ( "fields" ) {
477
+ created_embed = created_embed. fields ( fields. iter ( ) . filter_map ( |v| {
478
+ let name = v. get_str ( "name" ) ?;
479
+ let value = v. get_str ( "value" ) ?;
480
+ let inline = v. get_bool ( "inline" ) . unwrap_or_default ( ) ;
481
+ Some ( ( name, value, inline) )
482
+ } ) ) ;
483
+ } ;
484
+ if let Some ( footer) = embed. get ( "footer" ) {
485
+ if let Some ( text) = footer. as_str ( ) {
486
+ let mut created_embed_footer = CreateEmbedFooter :: new ( text) ;
487
+ if let Some ( text) = footer. get_str ( "text" ) {
488
+ created_embed_footer = created_embed_footer. text ( text) ;
489
+ } ;
490
+ if let Some ( icon_url) = footer. get_str ( "icon_url" ) {
491
+ created_embed_footer = created_embed_footer. icon_url ( icon_url) ;
492
+ } ;
493
+ created_embed = created_embed. footer ( created_embed_footer) ;
515
494
} ;
516
-
517
- m
518
- } )
519
- . await
520
- {
495
+ } ;
496
+ created_message = created_message. embed ( created_embed) ;
497
+ } ;
498
+ if let Some ( reactions) = reply. get ( "reactions" ) . and_then ( to_reactions) {
499
+ created_message = created_message. reactions ( reactions) ;
500
+ } ;
501
+ if let Err ( e) = channel. send_message ( & ctx, created_message) . await {
521
502
error ! ( "Discord send error: {}" , e) ;
522
503
} ;
523
504
} ;
0 commit comments