char/phoebe
git clone https://git.t4t.associates/char/phoebe
4c2eded
legacy
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 ( 20token : String , 21bridgers : Arc < Bridgers >, 22discord_tx : mpsc:: UnboundedSender < MessageEvent >, 23) { 24let ( discord_ctx_tx, mut discord_ctx_rx) = mpsc:: unbounded_channel ::< discord:: Context >(); 25 tokio:: spawn ( async move { 26let 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 { 32while let Some ( discord) = discord_ctx_rx. recv (). await { 33 bridgers. discord . lock (). unwrap (). replace ( Some ( discord)); 34} 35}); 36} 37 38async fn setup_matrix ( 39homeserver_url : String , 40username : String , 41password : String , 42bridgers : Arc < Bridgers >, 43event_tx : mpsc:: UnboundedSender < MessageEvent >, 44) { 45let 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 53let 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 63let bridgers =Arc :: new ( Bridgers :: new ()); 64 bridgers. link_channels ( & [ 65ChannelReference :: Discord ( 844290936942755903 ), 66ChannelReference :: Matrix ( "!NdTsEObHNFnwLyoVvp:lu.gl" . to_string ()), 67]); 68 69let ( event_tx, mut event_rx) = tokio:: sync:: mpsc:: unbounded_channel ::< MessageEvent >(); 70 71# [ inline ] 72fn get_env_var ( key : & str ) ->String { 73 std:: env:: var ( key). expect ( "DISCORD_TOKEN not set in environment" ) 74} 75 76setup_discord ( 77get_env_var ( "DISCORD_TOKEN" ), 78Arc :: clone ( & bridgers), 79 event_tx. clone (), 80) 81. await ; 82 83setup_matrix ( 84get_env_var ( "MATRIX_HOMESERVER" ), 85get_env_var ( "MATRIX_USERNAME" ), 86get_env_var ( "MATRIX_PASSWORD" ), 87Arc :: clone ( & bridgers), 88 event_tx. clone (), 89) 90. await ; 91 92while let Some ( event) = event_rx. recv (). await { 93match event{ 94MessageEvent :: SendText ( sent_message) =>{ 95 bridgers. send_message ( * sent_message). await ; 96} 97MessageEvent :: EditText ( edited_message) =>{ 98 bridgers. edit_message ( * edited_message). await ; 99} 100MessageEvent :: Delete ( deleted_message) =>{ 101 bridgers. delete_message ( * deleted_message). await ; 102} 103MessageEvent :: SendImage ( sent_media) =>{ 104 bridgers. send_image ( * sent_media). await ; 105} 106 107MessageEvent :: AdminLinkChannels ( channels) =>{ 108 bridgers. link_channels ( & channels); 109} 110} 111} 112}