char/phoebe
git clone https://git.t4t.associates/char/phoebe
4fc8c15
main
1use phoebe::{ 2 mid_chat::{ self , ChatMessage , ChatMessageEdit , ChatMessageReference , ChatReference }, 3 prelude:: * , 4DynServiceLookup , 5}; 6use serenity::{ client:: Context , Client }; 7use tracing::{ debug, info}; 8 9mod chat_conv; 10mod handler; 11mod lookup; 12mod sender; 13 14pub fn discord_reference ( id : impl ToString ) -> mid_chat:: ChatReference { 15 mid_chat:: ChatReference { 16service : "discord" , 17id : id. to_string (), 18} 19} 20 21pub struct DiscordService { 22pub core_db : SqlitePool , 23pub discord_media_db : SqlitePool , 24pub ctx : Context , 25pub dyn_service : DynServiceLookup , 26} 27 28pub async fn setup ( 29core_db : SqlitePool , 30tx : ChatEventSender , 31dyn_service : DynServiceLookup , 32) ->Result < DiscordService > { 33info! ( "Setting up Discord service…" ); 34 35let discord_media_db = phoebe:: db:: open ( "discord_media" ). await ?; 36 sqlx:: migrate!(). run ( & discord_media_db). await ?; 37 38let ( ctx_tx, mut ctx_rx) = tokio:: sync:: mpsc:: unbounded_channel ::< Context >(); 39 40let discord_handler = handler:: DiscordHandler { 41core_db : core_db. clone (), 42discord_media_db : discord_media_db. clone (), 43chat_event_tx : tx, 44 ctx_tx, 45}; 46 47debug! ( "Logging in…" ); 48let discord_token = std:: env:: var ( "PHOEBE_DISCORD_TOKEN" ) 49. expect ( "PHOEBE_DISCORD_TOKEN environment variable was not set!" ); 50 51let mut client =Client :: builder ( & discord_token) 52. event_handler ( discord_handler) 53. await ?; 54 55 tokio:: spawn ( async move { 56 client 57. start () 58. await 59. expect ( "Failed to start Discord client" ) 60}); 61 62let discord_ctx = ctx_rx. recv (). await . expect ( "Couldn't get Discord context" ); 63debug! ( "Logged in!" ); 64 65Ok ( DiscordService { 66 core_db, 67 discord_media_db, 68ctx : discord_ctx, 69 dyn_service, 70}) 71} 72 73# [ async_trait ] 74impl Service for DiscordService { 75fn tag ( & self ) ->&' static str { 76"discord" 77} 78 79async fn send_chat_message ( 80& mut self , 81source : & ChatMessage , 82destination_channel : ChatReference , 83) ->Vec < ChatMessageReference > { 84assert_eq! ( destination_channel. service , "discord" ); 85 sender:: send_discord_message ( self , source, destination_channel) 86. await 87. ok () 88. into_iter () 89. collect () 90} 91 92async fn delete_message ( & mut self , message : & ChatMessageReference ) ->bool { 93assert_eq! ( message. channel . service , "discord" ); 94 sender:: delete_discord_message ( self , message). await . is_ok () 95} 96 97async fn edit_message ( 98& mut self , 99prev_origin : & ChatMessageReference , 100new_message : & ChatMessageEdit , 101) ->Vec < ChatMessageReference > { 102assert_eq! ( prev_origin. channel . service , "discord" ); 103let _ = sender:: edit_discord_message ( self , prev_origin, new_message). await ; 104vec! [] 105} 106}