diff --git a/src/main.rs b/src/main.rs index 859d5e7..3ba142f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,7 +7,7 @@ use serenity::{ model::{ channel::Message, guild::Member, - id::{ChannelId, UserId}, + id::{ChannelId, GuildId, UserId}, prelude::Ready, webhook::Webhook, }, @@ -15,6 +15,8 @@ use serenity::{ Client as DiscordClient, }; +use tokio::sync::Mutex; + use irc::{ client::{data::Config, Client as IrcClient, Sender}, proto::Command, @@ -91,7 +93,7 @@ impl EventHandler for Handler { for mat in PING_RE_1.find_iter(&msg.content) { let slice = &msg.content[mat.start() + 2..mat.end() - 1]; let id = slice.parse::().unwrap(); - for member in &*members { + for member in &*members.lock().await { if id == member.user.id.0 { let nick = { match &member.nick { @@ -108,7 +110,7 @@ impl EventHandler for Handler { for mat in PING_RE_2.find_iter(&msg.content) { let slice = &msg.content[mat.start() + 3..mat.end() - 1]; let id = slice.parse::().unwrap(); - for member in &*members { + for member in &*members.lock().await { if id == member.user.id.0 { let nick = { match &member.nick { @@ -163,6 +165,17 @@ impl EventHandler for Handler { let mut data = ctx.data.write().await; data.insert::(id); } + + async fn guild_member_addition(&self, ctx: Context, _: GuildId, new_member: Member) { + let members = { + let data = ctx.data.read().await; + let members = data.get::().unwrap().to_owned(); + + members + }; + + members.lock().await.push(new_member); + } } struct HttpKey; @@ -188,7 +201,7 @@ impl TypeMapKey for SenderKey { } impl TypeMapKey for MembersKey { - type Value = Arc>; + type Value = Arc>>; } #[tokio::main] @@ -219,7 +232,7 @@ async fn main() -> anyhow::Result<()> { let http = discord_client.cache_and_http.http.clone(); - let members = Arc::new( + let members = Arc::new(Mutex::new( channel_id .to_channel(discord_client.cache_and_http.clone()) .await? @@ -228,7 +241,7 @@ async fn main() -> anyhow::Result<()> { .guild_id .members(&http, None, None) .await?, - ); + )); { let mut data = discord_client.data.write().await; @@ -260,7 +273,7 @@ async fn irc_loop( http: Arc, channel_id: ChannelId, webhook: Option, - members: Arc>, + members: Arc>>, ) -> anyhow::Result<()> { let mut avatar_cache: HashMap> = HashMap::new(); let mut id_cache: HashMap> = HashMap::new(); @@ -285,7 +298,7 @@ async fn irc_loop( mentioned_1 = id.to_owned(); } else { let mut found = false; - for member in &*members { + for member in &*members.lock().await { let nick = match &member.nick { Some(s) => s.to_owned(), None => member.user.name.clone(), @@ -310,7 +323,7 @@ async fn irc_loop( dbg!(slice); if id_cache.get(slice).is_none() { let mut found = false; - for member in &*members { + for member in &*members.lock().await { let nick = match &member.nick { Some(s) => s.to_owned(), None => member.user.name.clone(), @@ -333,7 +346,7 @@ async fn irc_loop( if let Some(ref webhook) = webhook { if avatar_cache.get(nickname).is_none() { let mut found = false; - for member in &*members { + for member in &*members.lock().await { let nick = match &member.nick { Some(s) => s.to_owned(), None => member.user.name.clone(),