rustyclaw_core/messengers/
mod.rs1use anyhow::Result;
17use async_trait::async_trait;
18use serde::{Deserialize, Serialize};
19
20#[derive(Debug, Clone, Serialize, Deserialize)]
24pub struct Message {
25 pub id: String,
26 pub sender: String,
27 pub content: String,
28 pub timestamp: i64,
29 #[serde(default)]
30 pub channel: Option<String>,
31 #[serde(default)]
32 pub reply_to: Option<String>,
33 #[serde(default)]
34 pub media: Option<Vec<MediaAttachment>>,
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct MediaAttachment {
40 pub url: Option<String>,
41 pub path: Option<String>,
42 pub mime_type: Option<String>,
43 pub filename: Option<String>,
44}
45
46#[derive(Debug, Default)]
48pub struct SendOptions<'a> {
49 pub recipient: &'a str,
50 pub content: &'a str,
51 pub reply_to: Option<&'a str>,
52 pub silent: bool,
53 pub media: Option<&'a str>,
54}
55
56#[async_trait]
60pub trait Messenger: Send + Sync {
61 fn name(&self) -> &str;
63
64 fn messenger_type(&self) -> &str;
66
67 async fn initialize(&mut self) -> Result<()>;
69
70 async fn send_message(&self, recipient: &str, content: &str) -> Result<String>;
72
73 async fn send_message_with_options(&self, opts: SendOptions<'_>) -> Result<String> {
75 self.send_message(opts.recipient, opts.content).await
77 }
78
79 async fn receive_messages(&self) -> Result<Vec<Message>>;
81
82 fn is_connected(&self) -> bool;
84
85 async fn disconnect(&mut self) -> Result<()>;
87
88 async fn set_typing(&self, _channel: &str, _typing: bool) -> Result<()> {
90 Ok(())
91 }
92}
93
94pub struct MessengerManager {
98 messengers: Vec<Box<dyn Messenger>>,
99}
100
101impl MessengerManager {
102 pub fn new() -> Self {
103 Self {
104 messengers: Vec::new(),
105 }
106 }
107
108 pub fn add_messenger(&mut self, messenger: Box<dyn Messenger>) {
110 self.messengers.push(messenger);
111 }
112
113 pub async fn initialize_all(&mut self) -> Result<()> {
115 for messenger in &mut self.messengers {
116 messenger.initialize().await?;
117 }
118 Ok(())
119 }
120
121 pub fn get_messengers(&self) -> &[Box<dyn Messenger>] {
123 &self.messengers
124 }
125
126 pub fn get_messenger(&self, name: &str) -> Option<&dyn Messenger> {
128 self.messengers
129 .iter()
130 .find(|m| m.name() == name)
131 .map(|b| &**b)
132 }
133
134 pub fn get_messenger_by_type(&self, msg_type: &str) -> Option<&dyn Messenger> {
136 self.messengers
137 .iter()
138 .find(|m| m.messenger_type() == msg_type)
139 .map(|b| &**b)
140 }
141
142 pub async fn disconnect_all(&mut self) -> Result<()> {
144 for messenger in &mut self.messengers {
145 messenger.disconnect().await?;
146 }
147 Ok(())
148 }
149}
150
151impl Default for MessengerManager {
152 fn default() -> Self {
153 Self::new()
154 }
155}
156
157mod console;
160mod discord;
161mod google_chat;
162pub mod group_chat;
163mod imessage;
164mod irc;
165pub mod media;
166mod slack;
167pub mod streaming;
168mod teams;
169mod telegram;
170mod webhook;
171
172pub use console::ConsoleMessenger;
173pub use discord::DiscordMessenger;
174pub use google_chat::GoogleChatMessenger;
175pub use group_chat::GroupChatConfig;
176pub use imessage::IMessageMessenger;
177pub use irc::IrcMessenger;
178pub use media::{MediaConfig, MediaType};
179pub use slack::SlackMessenger;
180pub use streaming::{StreamBuffer, StreamConfig, StreamStrategy};
181pub use teams::TeamsMessenger;
182pub use telegram::TelegramMessenger;
183pub use webhook::WebhookMessenger;
184
185#[cfg(feature = "matrix")]
190mod matrix;
191#[cfg(feature = "matrix")]
192pub use matrix::MatrixMessenger;
193
194#[cfg(feature = "whatsapp")]
199mod whatsapp;
200#[cfg(feature = "whatsapp")]
201pub use whatsapp::WhatsAppMessenger;
202
203#[cfg(feature = "signal-cli")]
206mod signal_cli;
207#[cfg(feature = "signal-cli")]
208pub use signal_cli::SignalCliMessenger;
209
210#[cfg(feature = "matrix-cli")]
211mod matrix_cli;
212#[cfg(feature = "matrix-cli")]
213pub use matrix_cli::{MatrixCliMessenger, MatrixDmConfig};
214
215#[cfg(feature = "telegram-cli")]
216mod telegram_cli;
217#[cfg(feature = "telegram-cli")]
218pub use telegram_cli::TelegramCliMessenger;
219
220#[cfg(feature = "discord-cli")]
221mod discord_cli;
222#[cfg(feature = "discord-cli")]
223pub use discord_cli::DiscordCliMessenger;
224
225#[cfg(feature = "slack-cli")]
226mod slack_cli;
227#[cfg(feature = "slack-cli")]
228pub use slack_cli::SlackCliMessenger;