char/phoebe
git clone https://git.t4t.associates/char/phoebe
4fc8c15
main
1use phoebe::{ get_message_link_id, mid_chat:: * , prelude:: * }; 2use serenity::{ 3 client::{ Context , EventHandler }, 4 model:: prelude:: * , 5}; 6use tracing:: debug; 7 8use crate :: discord_reference; 9 10pub struct DiscordHandler { 11pub core_db : SqlitePool , 12pub discord_media_db : SqlitePool , 13pub chat_event_tx : ChatEventSender , 14pub ctx_tx : tokio:: sync:: mpsc:: UnboundedSender < Context >, 15} 16 17impl DiscordHandler { 18async fn get_author ( & self , ctx : & Context , message : & Message ) ->ChatAuthor { 19let display_name = message 20. author_nick ( ctx) 21. await 22. unwrap_or_else ( || message. author . name . clone ()); 23 24async fn tag_color ( ctx : & Context , message : & Message ) ->Option <[ u8 ; 3 ]> { 25let color = message. member ( ctx). await . ok () ?. colour ( ctx). await ?; 26Some ([ color. r (), color. b (), color. g ()]) 27} 28 29let display_color =tag_color ( ctx, message). await ; 30 31let avatar_url = message 32. author 33. static_avatar_url () 34. unwrap_or_else ( || message. author . default_avatar_url ()); 35 36ChatAuthor { 37reference : discord_reference ( message. author . id ), 38 display_name, 39 display_color, 40avatar : ChatAttachment :: Online { 41media_type : None , 42url : avatar_url, 43}, 44} 45} 46} 47 48# [ async_trait ] 49impl EventHandler for DiscordHandler { 50async fn ready ( & self , ctx : Context , _ready : Ready ) { 51debug! ( "Discord signalled ready!" ); 52let _ =self . ctx_tx . send ( ctx); 53} 54 55async fn message ( & self , ctx : Context , message : Message ) { 56let origin =ChatMessageReference :: new ( discord_reference ( message. channel_id ), message. id ); 57 58// skip messages linked to ones we have already seen 59if let Ok ( mut conn) =self . core_db . acquire (). await { 60if get_message_link_id ( & mut conn, & origin). await . is_ok () { 61return ; 62} 63} 64 65let author =self . get_author ( & ctx, & message). await ; 66 67let content = discord_message_format:: parse ( & message. content ); 68let content =super :: chat_conv:: convert ( & content); 69 70let replies_to = message 71. referenced_message 72. as_ref () 73. map ( |m|ChatMessageReference :: new ( discord_reference ( m. channel_id ), m. id )); 74 75let attachments = message 76. attachments 77. into_iter () 78. map ( |a|ChatAttachment :: Online { 79media_type : a. content_type , 80url : a. url , 81}) 82. collect ::< Vec < _ >>(); 83 84let chat_message =ChatMessage { 85 origin, 86 author, 87 content, 88 attachments, 89replying : replies_to, 90}; 91 92let _ =self 93. chat_event_tx 94. send ( ChatEvent :: NewMessage ( Box :: new ( chat_message))) 95. expect ( "Failed to dispatch incoming Discord chat message" ); 96} 97 98async fn message_delete ( 99& self , 100_ctx : Context , 101channel_id : ChannelId , 102deleted_message_id : MessageId , 103_guild_id : Option < GuildId >, 104) { 105let origin =ChatMessageReference :: new ( discord_reference ( channel_id), deleted_message_id); 106let _ =self 107. chat_event_tx 108. send ( ChatEvent :: DeleteMessage ( origin)) 109. expect ( "Failed to dispatch incoming Discord chat message deletion" ); 110} 111 112async fn message_update ( 113& self , 114ctx : Context , 115_old_if_available : Option < Message >, 116new : Option < Message >, 117event : MessageUpdateEvent , 118) { 119if let Ok ( new_message) ={ 120if let Some ( m) = new{ 121Ok ( m) 122} else { 123 event. channel_id . message ( & ctx, event. id ). await 124} 125} { 126let origin =ChatMessageReference :: new ( 127discord_reference ( new_message. channel_id ), 128 new_message. id , 129); 130let author =self . get_author ( & ctx, & new_message). await ; 131 132let content = discord_message_format:: parse ( & new_message. content ); 133let content =super :: chat_conv:: convert ( & content); 134 135let edit =ChatMessageEdit { 136origin : origin. clone (), 137 author, 138new_content : content, 139}; 140 141let _ =self 142. chat_event_tx 143. send ( ChatEvent :: EditMessage ( origin, Box :: new ( edit))) 144. expect ( "Failed to dispatch incoming Discord chat message update" ); 145} 146} 147}