Update member list when new member joins

This commit is contained in:
Yash Karandikar 2022-01-15 12:40:53 -06:00
parent f2dda30468
commit 9657cb588d
Signed by: karx
GPG key ID: A794DA2529474BA5

View file

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