aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2020-11-22 23:01:28 +0100
committerGustav Sörnäs <gustav@sornas.net>2020-11-22 23:01:28 +0100
commit5788bc84c13ed56324bdc6dc7c61bb0ca12a9256 (patch)
tree4679422a18b45194c89e1c2956e457732a93bf0d
parentcfc6244b9cb88ec9521ec02dd0119c3b9f9bbee9 (diff)
downloadkodapa-5788bc84c13ed56324bdc6dc7c61bb0ca12a9256.tar.gz
print agenda when reminders are requested
-rw-r--r--src/agenda.rs2
-rw-r--r--src/discord.rs32
-rw-r--r--src/main.rs12
-rw-r--r--src/slack.rs33
4 files changed, 66 insertions, 13 deletions
diff --git a/src/agenda.rs b/src/agenda.rs
index a132bbb..8ed1840 100644
--- a/src/agenda.rs
+++ b/src/agenda.rs
@@ -91,7 +91,7 @@ where
}
}
-fn read_agenda() -> Agenda {
+pub fn read_agenda() -> Agenda {
serde_json::from_str::<Agenda>(
&fs::read_to_string("agenda.json").expect("Can't read agenda.json"),
)
diff --git a/src/discord.rs b/src/discord.rs
index fb121fb..438f0ed 100644
--- a/src/discord.rs
+++ b/src/discord.rs
@@ -1,4 +1,5 @@
use crate::agenda::{self, parse_message, AgendaPoint, Emoji};
+use crate::reminder::ReminderType;
use discord::{
model::{ChannelId, Event, PossibleServer, ReactionEmoji, UserId},
@@ -10,7 +11,7 @@ use std::{
sync::{Arc, Mutex},
};
use tokio::{
- sync::mpsc,
+ sync::{mpsc, watch},
task::{spawn, spawn_blocking},
};
@@ -29,6 +30,7 @@ struct Handler {
pub async fn handle(
sender: mpsc::UnboundedSender<AgendaPoint>,
receiver: mpsc::UnboundedReceiver<AgendaPoint>,
+ reminder: watch::Receiver<ReminderType>,
) {
println!("Setting up Discord");
@@ -45,8 +47,9 @@ pub async fn handle(
.map(|id| Some(ChannelId(id.parse::<u64>().unwrap())))
.unwrap_or(CHANNEL);
- let (_, _) = join!(
+ let (_, _, _) = join!(
spawn(receive_from_slack(receiver, Arc::clone(&client), channel)),
+ spawn(handle_reminders(reminder, Arc::clone(&client), channel)),
spawn_blocking(move || receive_events(&mut Handler {
_our_id,
connection,
@@ -159,3 +162,28 @@ async fn receive_from_slack(
}
}
}
+
+async fn handle_reminders(
+ mut reminder: watch::Receiver<ReminderType>,
+ client: Arc<Mutex<discord::Discord>>,
+ channel: Option<ChannelId>,
+) {
+ if let Some(channel) = channel {
+ while let Some(reminder) = reminder.recv().await {
+ match reminder {
+ ReminderType::OneHour => {
+ client
+ .lock()
+ .unwrap()
+ .send_message(channel,
+ &format!("Meeting in one hour!\n{}",
+ agenda::read_agenda().to_string()),
+ "",
+ false)
+ .unwrap();
+ },
+ ReminderType::Void => {}
+ }
+ }
+ }
+}
diff --git a/src/main.rs b/src/main.rs
index 6bd2de5..8980b31 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,18 +4,20 @@ mod reminder;
mod slack;
use crate::agenda::AgendaPoint;
+use crate::reminder::ReminderType;
use futures::join;
-use tokio::sync::mpsc;
+use tokio::sync::{mpsc, watch};
#[tokio::main]
async fn main() {
- println!("Hello, world!");
-
let (from_discord, to_slack) = mpsc::unbounded_channel::<AgendaPoint>();
let (from_slack, to_discord) = mpsc::unbounded_channel::<AgendaPoint>();
+ let (reminder_sender, reminder_receiver) = watch::channel(ReminderType::Void);
+
join!(
- discord::handle(from_discord, to_discord),
- slack::handle(from_slack, to_slack),
+ reminder::handle(reminder_sender),
+ discord::handle(from_discord, to_discord, reminder_receiver.clone()),
+ slack::handle(from_slack, to_slack, reminder_receiver),
);
}
diff --git a/src/slack.rs b/src/slack.rs
index 9698109..1481cf1 100644
--- a/src/slack.rs
+++ b/src/slack.rs
@@ -1,4 +1,5 @@
use crate::agenda::{self, parse_message, AgendaPoint, Emoji};
+use crate::reminder::ReminderType;
use futures::join;
use slack::{Event, Message};
@@ -9,7 +10,7 @@ use std::{
};
use tokio::{
runtime::Runtime,
- sync::mpsc,
+ sync::{mpsc, watch},
task::{spawn, spawn_blocking},
};
use tokio_compat_02::FutureExt;
@@ -137,11 +138,11 @@ impl slack::EventHandler for Handler {
timestamp: Some(msg.ts.unwrap()),
},
)
- .compat(),
+ .compat(),
)
.unwrap();
}
- _ => {}
+ _ => {} // parse_message return
}
}
}
@@ -161,6 +162,7 @@ impl slack::EventHandler for Handler {
pub async fn handle(
sender: mpsc::UnboundedSender<AgendaPoint>,
receiver: mpsc::UnboundedReceiver<AgendaPoint>,
+ reminder: watch::Receiver<ReminderType>,
) {
println!("Setting up Slack");
@@ -186,14 +188,15 @@ pub async fn handle(
);
let slack_sender = client.sender().clone();
- let (_, _) = join!(
+ let (_, _, _) = join!(
+ spawn(receive_from_discord(receiver, slack_sender.clone(), channel.clone())),
+ spawn(handle_reminders(reminder, slack_sender, channel)),
spawn_blocking(move || {
match client.run(&mut handler) {
Ok(_) => {}
Err(e) => println!("Error: {}", e),
}
}),
- spawn(receive_from_discord(receiver, slack_sender, channel))
);
}
@@ -214,3 +217,23 @@ async fn receive_from_discord(
}
}
}
+
+async fn handle_reminders(
+ mut reminder: watch::Receiver<ReminderType>,
+ sender: slack::Sender,
+ channel: Option<String>,
+) {
+ if let Some(channel) = channel {
+ while let Some(reminder) = reminder.recv().await {
+ match reminder {
+ ReminderType::OneHour => {
+ sender.send_typing(&channel).unwrap();
+ sender
+ .send_message(&channel, &format!("Meeting in one hour!\n{}", agenda::read_agenda()))
+ .unwrap();
+ },
+ ReminderType::Void => {}
+ }
+ }
+ }
+}