char/phoebe

git clone https://git.t4t.associates/char/phoebe

videogame hackerBridge violet meadow4c2eded

legacy
3.0 KiB112 linesraw
1use std::sync::Arc;
2
3use discord::create_discord_client;
4use matrix::create_matrix_client;
5
6mod bridgers;
7mod channels;
8mod message_ast;
9mod messages;
10
11pub mod discord;
12pub mod matrix;
13
14use bridgers::Bridgers;
15use tokio::sync::mpsc;
16
17use crate::{channels::ChannelReference, messages::MessageEvent};
18
19async fn setup_discord(
20    token: String,
21    bridgers: Arc<Bridgers>,
22    discord_tx: mpsc::UnboundedSender<MessageEvent>,
23) {
24    let (discord_ctx_tx, mut discord_ctx_rx) = mpsc::unbounded_channel::<discord::Context>();
25    tokio::spawn(async move {
26        let mut discord = create_discord_client(discord_ctx_tx, discord_tx, &token).await;
27        discord.start().await.unwrap();
28    });
29
30    // Hack to grab the Context object when discord is ready
31    tokio::spawn(async move {
32        while let Some(discord) = discord_ctx_rx.recv().await {
33            bridgers.discord.lock().unwrap().replace(Some(discord));
34        }
35    });
36}
37
38async fn setup_matrix(
39    homeserver_url: String,
40    username: String,
41    password: String,
42    bridgers: Arc<Bridgers>,
43    event_tx: mpsc::UnboundedSender<MessageEvent>,
44) {
45    let client = create_matrix_client(homeserver_url, username, password, event_tx).await;
46
47    bridgers
48        .matrix
49        .lock()
50        .unwrap()
51        .replace(Some(client.clone()));
52
53    let settings = matrix::SyncSettings::default().token(client.sync_token().await.unwrap());
54    tokio::spawn(async move {
55        client.sync(settings).await;
56    });
57}
58
59#[tokio::main]
60async fn main() {
61    env_logger::init();
62
63    let bridgers = Arc::new(Bridgers::new());
64    bridgers.link_channels(&[
65        ChannelReference::Discord(844290936942755903),
66        ChannelReference::Matrix("!NdTsEObHNFnwLyoVvp:lu.gl".to_string()),
67    ]);
68
69    let (event_tx, mut event_rx) = tokio::sync::mpsc::unbounded_channel::<MessageEvent>();
70
71    #[inline]
72    fn get_env_var(key: &str) -> String {
73        std::env::var(key).expect("DISCORD_TOKEN not set in environment")
74    }
75
76    setup_discord(
77        get_env_var("DISCORD_TOKEN"),
78        Arc::clone(&bridgers),
79        event_tx.clone(),
80    )
81    .await;
82
83    setup_matrix(
84        get_env_var("MATRIX_HOMESERVER"),
85        get_env_var("MATRIX_USERNAME"),
86        get_env_var("MATRIX_PASSWORD"),
87        Arc::clone(&bridgers),
88        event_tx.clone(),
89    )
90    .await;
91
92    while let Some(event) = event_rx.recv().await {
93        match event {
94            MessageEvent::SendText(sent_message) => {
95                bridgers.send_message(*sent_message).await;
96            }
97            MessageEvent::EditText(edited_message) => {
98                bridgers.edit_message(*edited_message).await;
99            }
100            MessageEvent::Delete(deleted_message) => {
101                bridgers.delete_message(*deleted_message).await;
102            }
103            MessageEvent::SendImage(sent_media) => {
104                bridgers.send_image(*sent_media).await;
105            }
106
107            MessageEvent::AdminLinkChannels(channels) => {
108                bridgers.link_channels(&channels);
109            }
110        }
111    }
112}