The world's most clever kitty cat

Allow replying to self

bwc9876.dev a30d0c4a 5e0be501

verified
+30 -18
+1 -1
src/brain.rs
··· 96 96 let chance = if is_self { 45 } else { 80 }; 97 97 let roll = rand.u8(0..=100); 98 98 99 - (FORCE_REPLIES && !is_self) || roll <= chance 99 + (FORCE_REPLIES) || roll <= chance 100 100 } 101 101 102 102 fn extract_final_token(msg: &str) -> Option<Token> {
+6 -4
src/main.rs
··· 51 51 52 52 async fn handle_discord_event(event: Event, ctx: Arc<BotContext>) -> Result { 53 53 match event { 54 - Event::MessageCreate(msg) => handle_discord_message(msg, ctx).await?, 54 + Event::MessageCreate(msg) => handle_discord_message(msg, ctx).await, 55 55 Event::Ready(ev) => { 56 56 info!("Connected to gateway as {}", ev.user.name); 57 57 let brain = ctx.brain_handle.lock().await; 58 - update_status(&*brain, &ctx.shard_sender).context("Failed to update status")?; 58 + update_status(&*brain, &ctx.shard_sender).context("Failed to update status") 59 59 } 60 60 _ => { 61 61 debug!("Ev: {event:?}"); 62 + Ok(()) 62 63 } 63 64 } 64 - 65 - Ok(()) 66 65 } 67 66 68 67 fn load_brain(path: &Path) -> Result<Option<Brain>> { ··· 176 175 177 176 loop { 178 177 tokio::select! { 178 + 179 + biased; 180 + 179 181 Ok(()) = tokio::signal::ctrl_c() => { 180 182 info!("SIGINT: Closing connection and saving"); 181 183 shard.close(CloseFrame::NORMAL);
+23 -13
src/on_message.rs
··· 20 20 .is_some_and(|flags| flags.contains(MessageFlags::EPHEMERAL)); 21 21 let is_dm = msg.guild_id.is_none(); 22 22 23 - // Should Ingest Message? 24 - if is_self || !is_normal_message || is_ephemeral || is_dm { 23 + // Should we consider this message at all? 24 + if !is_normal_message || is_ephemeral || is_dm { 25 25 return Ok(()); 26 26 } 27 27 28 - let mut brain = ctx.brain_handle.lock().await; 29 - let learned_new_word = brain.ingest(&msg.content); 30 - ctx.pending_save.store(true, Ordering::Relaxed); 28 + // Should we learn from this message? (We don't want to learn from ourselves) 29 + if !is_self { 30 + let mut brain = ctx.brain_handle.lock().await; 31 + let learned_new_word = brain.ingest(&msg.content); 32 + ctx.pending_save.store(true, Ordering::Relaxed); 31 33 32 - if learned_new_word { 33 - update_status(&*brain, &ctx.shard_sender).context("Failed to update status")?; 34 + if learned_new_word { 35 + update_status(&*brain, &ctx.shard_sender).context("Failed to update status")?; 36 + } 34 37 } 35 38 36 39 // Should Reply to Message? ··· 52 55 done_tx.send(()).ok(); 53 56 }); 54 57 58 + let brain = ctx.brain_handle.lock().await; 55 59 if let Some(reply_text) = brain 56 60 .respond(&msg.content, is_self, Some(typ_tx)) 57 61 .filter(|s| !s.trim().is_empty()) 58 62 { 59 63 drop(brain); 60 64 done_rx.await.ok(); 61 - ctx.http 65 + let allowed_mentions = AllowedMentions::default(); 66 + let my_msg = ctx 67 + .http 62 68 .create_message(msg.channel_id) 63 69 .content(&reply_text) 64 - .reply(msg.id) 65 - .fail_if_not_exists(false) 66 - .allowed_mentions(Some(&AllowedMentions::default())) 67 - .await 68 - .context("Failed to send message")?; 70 + .allowed_mentions(Some(&allowed_mentions)); 71 + 72 + let my_msg = if !is_self { 73 + my_msg.reply(msg.id).fail_if_not_exists(false) 74 + } else { 75 + my_msg 76 + }; 77 + 78 + my_msg.await.context("Failed to send message")?; 69 79 } 70 80 71 81 Ok(())