/ src / matrix / event_handlers / on_message.rs
on_message.rs
 1  use std::sync::Arc;
 2  
 3  use matrix_sdk::{
 4      Client, Room, RoomState,
 5      event_handler::Ctx,
 6      ruma::{
 7          api::client::receipt::create_receipt::v3::ReceiptType,
 8          events::{
 9              receipt::ReceiptThread,
10              room::message::{MessageType, OriginalSyncRoomMessageEvent},
11          },
12      },
13  };
14  
15  use crate::{context::Context, matrix::commands};
16  
17  pub async fn handle(
18      event: OriginalSyncRoomMessageEvent,
19      client: Client,
20      room: Room,
21      context: Ctx<Arc<Context>>,
22  ) -> anyhow::Result<()> {
23      let event = event.into_full_event(room.room_id().to_owned());
24      if room.state() != RoomState::Joined || event.sender == client.user_id().unwrap() {
25          return Ok(());
26      }
27  
28      tokio::spawn({
29          let room = room.clone();
30          let event_id = event.event_id.clone();
31          async move {
32              room.send_single_receipt(ReceiptType::Read, ReceiptThread::Unthreaded, event_id)
33                  .await
34          }
35      });
36  
37      let MessageType::Text(content) = &event.content.msgtype else {
38          return Ok(());
39      };
40  
41      if content
42          .body
43          .trim()
44          .starts_with(client.user_id().unwrap().as_str())
45          || content.formatted.as_ref().is_some_and(|f| {
46              f.body.trim().starts_with(&format!(
47                  r#"<a href="{}">"#,
48                  client.user_id().unwrap().matrix_to_uri(),
49              ))
50          })
51      {
52          commands::help(&event, &room, &context.config).await?;
53          return Ok(());
54      }
55  
56      let Some(cmd) = content
57          .body
58          .strip_prefix(&context.config.matrix.command_prefix)
59      else {
60          return Ok(());
61      };
62  
63      commands::handle(&event, room, context.0, cmd).await
64  }