Skip to content

Commit 4acac1e

Browse files
committed
Update discord connector to latest serenity library
Signed-off-by: Darach Ennis <darach@gmail.com>
1 parent dc27e5b commit 4acac1e

File tree

3 files changed

+124
-141
lines changed

3 files changed

+124
-141
lines changed

tremor-connectors/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ bytes = "1.0"
167167
tempfile = { version = "3.8", default-features = false }
168168
env_logger = "0.11"
169169
tremor-connectors-test-helpers = { path = "../tremor-connectors-test-helpers", version = "0.13.0-rc.23" }
170-
tide = { version = "0.16", default-features = false } # TODO remove tide from TestHttpServer
170+
tide = { version = "0.16", default-features = false } # TODO remove tide from TestHttpServer
171171
tokio = { version = "1.34", default-features = false, features = [
172172
"full",
173173
"test-util",

tremor-connectors/src/impls/discord/handler.rs

Lines changed: 105 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@
1616
use super::utils::{as_snowflake, get_snowflake, to_reactions, DiscordMessage};
1717
use crate::channel::{Receiver, Sender};
1818
use serenity::{
19+
all::{CreateEmbed, CreateEmbedAuthor, CreateEmbedFooter, CreateMessage, EditMember},
1920
model::{
20-
channel::{Channel, ChannelCategory, GuildChannel, Message, Reaction},
21+
channel::{GuildChannel, Message, Reaction},
2122
event::{
22-
ChannelPinsUpdateEvent, GuildMembersChunkEvent, ResumedEvent, TypingStartEvent,
23-
VoiceServerUpdateEvent,
23+
ChannelPinsUpdateEvent, GuildMemberUpdateEvent, GuildMembersChunkEvent, ResumedEvent,
24+
TypingStartEvent, VoiceServerUpdateEvent,
2425
},
2526
guild::{Emoji, Guild, Member, PartialGuild, Role},
2627
id::{ChannelId, EmojiId, GuildId, MessageId, RoleId, UserId},
@@ -29,6 +30,7 @@ use serenity::{
2930
},
3031
prelude::*,
3132
};
33+
use simd_json::prelude::ValueObjectAccess;
3234
use std::collections::HashMap;
3335
use tokio::task;
3436
use tremor_value::{prelude::*, to_value};
@@ -57,6 +59,7 @@ impl Handler {
5759
}
5860
}
5961
}
62+
6063
#[async_trait::async_trait]
6164
impl EventHandler for Handler {
6265
// 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 {
7174
}
7275
}
7376

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;
8279
}
8380

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))
9188
.await;
9289
}
9390

@@ -133,7 +130,7 @@ impl EventHandler for Handler {
133130
self.forward(DiscordMessage::TypingStart(e)).await;
134131
}
135132

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) {
137134
self.forward(DiscordMessage::ChannelUpdate { old, new })
138135
.await;
139136
}
@@ -148,7 +145,7 @@ impl EventHandler for Handler {
148145
.await;
149146
}
150147

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>) {
152149
self.forward(DiscordMessage::GuildCreate { guild, is_new })
153150
.await;
154151
}
@@ -200,11 +197,13 @@ impl EventHandler for Handler {
200197
&self,
201198
_ctx: Context,
202199
old_if_available: Option<Member>,
203-
new: Member,
200+
member: Option<Member>,
201+
event: GuildMemberUpdateEvent,
204202
) {
205203
self.forward(DiscordMessage::MemberUpdate {
206204
old_if_available,
207-
new,
205+
member,
206+
event,
208207
})
209208
.await;
210209
}
@@ -245,11 +244,6 @@ impl EventHandler for Handler {
245244
.await;
246245
}
247246

248-
async fn guild_unavailable(&self, _ctx: Context, guild_id: GuildId) {
249-
self.forward(DiscordMessage::GuildUnavailable(guild_id))
250-
.await;
251-
}
252-
253247
async fn guild_update(
254248
&self,
255249
_ctx: Context,
@@ -325,9 +319,17 @@ impl EventHandler for Handler {
325319
self.forward(DiscordMessage::Resume(resume)).await;
326320
}
327321

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+
})
330331
.await;
332+
}
331333
}
332334

333335
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) {
358360
while let Some(reply) = rx.recv().await {
359361
if let Some(reply) = reply.get("guild") {
360362
let guild = if let Some(id) = get_snowflake(reply, "id") {
361-
GuildId(id)
363+
GuildId::new(id)
362364
} else {
363365
error!("guild `id` missing");
364366
continue;
365367
};
366368

367369
if let Some(member) = reply.get("member") {
368370
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 {
371373
Ok(current_member) => current_member,
372374
Err(e) => {
373375
error!("Member error: {}", e);
@@ -377,7 +379,7 @@ async fn reply_loop(mut rx: Receiver<Value<'static>>, ctx: Context) {
377379
if let Some(to_remove) = member.get_array("remove_roles") {
378380
let to_remove: Vec<_> = to_remove
379381
.iter()
380-
.filter_map(|v| as_snowflake(v).map(RoleId))
382+
.filter_map(|v| as_snowflake(v).map(RoleId::new))
381383
.collect();
382384
if let Err(e) = current_member.remove_roles(&ctx, &to_remove).await {
383385
error!("Role removal error: {}", e);
@@ -387,24 +389,20 @@ async fn reply_loop(mut rx: Receiver<Value<'static>>, ctx: Context) {
387389
if let Some(to_roles) = member.get_array("add_roles") {
388390
let to_roles: Vec<_> = to_roles
389391
.iter()
390-
.filter_map(|v| as_snowflake(v).map(RoleId))
392+
.filter_map(|v| as_snowflake(v).map(RoleId::new))
391393
.collect();
392394
if let Err(e) = current_member.add_roles(&ctx, &to_roles).await {
393395
error!("Role add error: {}", e);
394396
};
395397
}
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;
408406
if let Err(e) = r {
409407
error!("Mute/Deafen error: {}", e);
410408
};
@@ -413,7 +411,7 @@ async fn reply_loop(mut rx: Receiver<Value<'static>>, ctx: Context) {
413411
}
414412
if let Some(reply) = reply.get("message") {
415413
let channel = if let Some(id) = get_snowflake(reply, "channel_id") {
416-
ChannelId(id)
414+
ChannelId::new(id)
417415
} else {
418416
error!("channel_id missing");
419417
continue;
@@ -440,84 +438,67 @@ async fn reply_loop(mut rx: Receiver<Value<'static>>, ctx: Context) {
440438
}
441439

442440
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);
515494
};
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 {
521502
error!("Discord send error: {}", e);
522503
};
523504
};

0 commit comments

Comments
 (0)