aboutsummaryrefslogtreecommitdiffstats
path: root/src/agenda.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/agenda.rs')
-rw-r--r--src/agenda.rs91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/agenda.rs b/src/agenda.rs
new file mode 100644
index 0000000..d1a940d
--- /dev/null
+++ b/src/agenda.rs
@@ -0,0 +1,91 @@
+use serde::{
+ Deserialize,
+ Serialize,
+};
+use std::{
+ fmt,
+ fs,
+};
+use tokio::sync::mpsc;
+
+#[derive(Clone, Debug, Deserialize, Serialize)]
+pub struct AgendaPoint {
+ title: String,
+ adder: String,
+}
+
+impl fmt::Display for AgendaPoint {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "{} ({})", self.title, self.adder)
+ }
+}
+
+impl AgendaPoint {
+ pub fn to_add_message(&self) -> String {
+ format!("'{}' added by {}", self.title, self.adder)
+ }
+
+ fn to_add_message_response(&self) -> String {
+ //TODO should add a reaction instead
+ format!("Added '{}'", self.title)
+ }
+}
+
+#[derive(Deserialize, Serialize)]
+pub struct Agenda {
+ points: Vec<AgendaPoint>,
+}
+
+impl Agenda {
+ fn write(&self) {
+ fs::write(std::path::Path::new("agenda.json"),
+ serde_json::to_string_pretty(&self).expect("Can't serialize agenda"))
+ .expect("Can't write agenda.json");
+ }
+}
+
+pub enum ParseError {
+ NoSuchCommand,
+}
+
+pub fn parse_message(
+ message: &str,
+ sender: &str,
+ point_sender: &mpsc::UnboundedSender<AgendaPoint>
+) -> Result<Option<String>, ParseError> {
+ if message.starts_with("!add ") {
+ let mut agenda = read_agenda();
+ let agenda_point = AgendaPoint {
+ title: message[5..].to_string(),
+ adder: sender.to_string(),
+ };
+ point_sender.send(agenda_point.clone()).unwrap();
+ let response = agenda_point.to_add_message_response();
+ agenda.points.push(agenda_point);
+ agenda.write();
+ Ok(Some(response))
+ } else if message.starts_with("!agenda") {
+ Ok(Some(read_agenda()
+ .points
+ .iter()
+ .map(|p| p.to_string())
+ .collect::<Vec<_>>()
+ .join("\n")))
+ } else if message.starts_with("!clear") {
+ Agenda {
+ points: Vec::new(),
+ }.write();
+ Ok(None)
+ } else if message.starts_with("!help") {
+ Ok(Some("Available commands:\n```!add -- Add something\n!agenda -- Print the agenda\n!clear -- Remove all items\n!help```".to_string()))
+ } else {
+ Err(ParseError::NoSuchCommand)
+ }
+}
+
+fn read_agenda() -> Agenda {
+ serde_json::from_str::<Agenda>(
+ &fs::read_to_string("agenda.json")
+ .expect("Can't read agenda.json"))
+ .expect("Error parsing agenda.json")
+}