summary refs log tree commit diff
path: root/src/system/plugin/reproxy.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/system/plugin/reproxy.rs')
-rw-r--r--src/system/plugin/reproxy.rs62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/system/plugin/reproxy.rs b/src/system/plugin/reproxy.rs
new file mode 100644
index 0000000..145bed8
--- /dev/null
+++ b/src/system/plugin/reproxy.rs
@@ -0,0 +1,62 @@
+use async_trait::async_trait;
+use twilight_model::id::{marker::ChannelMarker, Id};
+use twilight_model::channel::Message;
+use crate::system::util;
+use crate::system::{log::Logger, types::{Response, System}};
+
+use super::{PluginCommand, SeancePlugin};
+
+pub struct Reproxy;
+
+impl Reproxy {
+    pub fn new() -> Self {
+        Self
+    }
+}
+
+#[async_trait]
+impl<'system> SeancePlugin<'system> for Reproxy {
+    fn get_commands(&self) -> Vec<PluginCommand> {
+        vec![]
+    }
+
+    async fn handle_command<'message>(&self, _logger: &'system Logger, _system: &'system System, _message: &'message Message, _command: PluginCommand, _args: Vec<&'message str>) {
+        unreachable!("Reproxy has no commands");
+    }
+
+    async fn handle_message<'message>(&self, logger: &'system Logger, system: &'system System, message: &'message Message, response: &'message mut Response) {
+        if let Response::Proxy { member, content } = response {
+            if content.as_str().trim() == "*" {
+                let most_recent_message = system.get_most_recent_message(message.channel_id).await;
+                if let Some((reproxy_target, update_most_recent)) = match message.kind {
+                    twilight_model::channel::message::MessageType::Regular => most_recent_message.map(|(message, _)| (message, true)),
+                    twilight_model::channel::message::MessageType::Reply => async {Some((
+                        message.referenced_message.as_ref()?.as_ref().clone(),
+                        message.referenced_message.as_ref()?.id == most_recent_message?.0.id
+                    ))}.await,
+                    _ => todo!(),
+                } {
+                    if let Ok(new_message) = util::duplicate_message(&member.client, &reproxy_target, reproxy_target.content.as_str()).await {
+                        let _ = {member.client.lock().await.delete_message(reproxy_target.channel_id, reproxy_target.id).await};
+
+                        if update_most_recent {
+                            system.cache_most_recent_message(new_message.channel_id, new_message, member.clone()).await;
+                        }
+
+                        *response = Response::ExplicitNoop { delete_source: true, member: Some(member.clone()) };
+                    } else {
+                        logger.log_err(None, format!("Error reproxying message")).await;
+                        *response = Response::ExplicitNoop { delete_source: false, member: None };
+                    }
+                } else {
+                    logger.log_err(None, format!("Could not find reproxy target")).await;
+                    *response = Response::ExplicitNoop { delete_source: false, member: None };
+                }
+            }
+        }
+    }
+
+    async fn post_response<'message>(&self, _logger: &'system Logger, _system: &'system System, _message: &'message Message, _channel: Id<ChannelMarker>, _response: &'message Response) {
+        // noop
+    }
+}