From 095bf438a1c1f7c8817a103dee7606787409e008 Mon Sep 17 00:00:00 2001 From: Yash Karandikar Date: Thu, 7 Apr 2022 14:39:30 -0500 Subject: [PATCH] Finalize channel mappings from IRC -> Discord --- README.md | 2 +- src/main.rs | 43 ++++++++++++++++++++++--------------------- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 158cca3..661cbfd 100644 --- a/README.md +++ b/README.md @@ -10,5 +10,5 @@ TODO: - [x] don't ping IRC users (and color IRC usernames) - [x] handle discord pings - [x] handle multiple pings -- [ ] multiple channels +- [x] multiple channels - [x] IRC and Discord formatting diff --git a/src/main.rs b/src/main.rs index 23d3b7f..5c18348 100644 --- a/src/main.rs +++ b/src/main.rs @@ -32,7 +32,6 @@ use serde::Deserialize; #[derive(Deserialize)] struct DircordConfig { token: String, - webhook: Option, nickname: Option, server: String, port: Option, @@ -40,6 +39,7 @@ struct DircordConfig { tls: Option, raw_prefix: Option, channels: HashMap, + webhooks: Option>, } struct Handler; @@ -509,12 +509,20 @@ async fn main() -> anyhow::Result<()> { data.insert::((*channels).clone()); } - let webhook = parse_webhook_url(http.clone(), conf.webhook) - .await - .expect("Invalid webhook URL"); + let mut webhooks_transformed: HashMap = HashMap::new(); + + if let Some(webhooks) = conf.webhooks { + for (channel, wh) in webhooks.iter() { + let parsed = parse_webhook_url(http.clone(), wh.to_string()) + .await + .expect("Invalid webhook URL"); + + webhooks_transformed.insert(channel.clone(), parsed); + } + } select! { - r = irc_loop(irc_client, http.clone(), channels.clone(), webhook, members) => r?, + r = irc_loop(irc_client, http.clone(), channels.clone(), webhooks_transformed, members) => r?, r = discord_client.start() => r?, _ = terminate_signal() => { for (_, &v) in channels.iter() { @@ -536,7 +544,7 @@ async fn irc_loop( mut client: IrcClient, http: Arc, mapping: Arc>, - webhook: Option, + webhooks: HashMap, members: Arc>>, ) -> anyhow::Result<()> { let mut avatar_cache: HashMap> = HashMap::new(); @@ -606,7 +614,7 @@ async fn irc_loop( } } } - if let Some(ref webhook) = webhook { + if let Some(ref webhook) = webhooks.get(channel) { if avatar_cache.get(nickname).is_none() { let mut found = false; for member in &*members.lock().await { @@ -900,18 +908,11 @@ async fn irc_loop( Ok(()) } -async fn parse_webhook_url( - http: Arc, - url: Option, -) -> anyhow::Result> { - if let Some(url) = url { - let url = url.trim_start_matches("https://discord.com/api/webhooks/"); - let split = url.split("/").collect::>(); - let id = split[0].parse::()?; - let token = split[1].to_string(); - let webhook = http.get_webhook_with_token(id, &token).await?; - Ok(Some(webhook)) - } else { - Ok(None) - } +async fn parse_webhook_url(http: Arc, url: String) -> anyhow::Result { + let url = url.trim_start_matches("https://discord.com/api/webhooks/"); + let split = url.split("/").collect::>(); + let id = split[0].parse::()?; + let token = split[1].to_string(); + let webhook = http.get_webhook_with_token(id, &token).await?; + Ok(webhook) }