atagen

malice

public
Star0
Watch0

Commit ed3363baaf01

tarball

atagen <boss@atagen.co>2026-10-25 03:13 UTC

2 files changed+66-7
mentions: expose persistent inbox commands
Modified file: crates/malice-core/src/request.rs+59 additions−6 deletions
@@ -1,8 +1,8 @@
11 use macltok::ruma::{events::GlobalAccountDataEventType, serde::Raw};
22 use macltok::{
33 AttachmentUpload, ClientHandle, CreateRoomOptions, ImagePackSource, MediaId, MediaSize,
4- MemberFilter, MessageContent, MessageEditContent, MirrorHandle, PackImageInfo, PackUsage,
5- Patch, RichText, TimelineId, VerificationAction, VerificationTarget,
4+ MemberFilter, MentionKey, MentionsBoundary, MessageContent, MessageEditContent, MirrorHandle,
5+ PackImageInfo, PackUsage, Patch, RichText, TimelineId, VerificationAction, VerificationTarget,
66 };
77 use serde::Deserialize;
88 use serde_json::json;
@@ -103,6 +103,28 @@ pub enum Request {
103103 #[serde(default)]
104104 limit: u32,
105105 },
106+ MentionsPage {
107+ #[serde(default)]
108+ cursor: Option<String>,
109+ #[serde(default)]
110+ limit: u32,
111+ },
112+ MentionContext {
113+ room_id: String,
114+ event_id: String,
115+ },
116+ RetryMentionContext {
117+ room_id: String,
118+ event_id: String,
119+ },
120+ SetMentionsRead {
121+ keys: Vec<MentionKey>,
122+ read: bool,
123+ },
124+ MarkMentionsReadThrough {
125+ boundary: MentionsBoundary,
126+ },
127+ RecoverMentions,
106128 Join {
107129 #[serde(default)]
108130 room: String,
@@ -526,9 +548,7 @@ pub async fn dispatch(
526548 limit,
527549 } => {
528550 let room_id = parse_room_id(&room_id)?;
529- let page = handle
530- .event_context_before(&room_id, &token, limit)
531- .await?;
551+ let page = handle.event_context_before(&room_id, &token, limit).await?;
532552 Ok(Reply::Json(json!(page)))
533553 }
534554 Request::EventContextAfter {
@@ -537,11 +557,44 @@ pub async fn dispatch(
537557 limit,
538558 } => {
539559 let room_id = parse_room_id(&room_id)?;
560+ let page = handle.event_context_after(&room_id, &token, limit).await?;
561+ Ok(Reply::Json(json!(page)))
562+ }
563+ Request::MentionsPage { cursor, limit } => {
540564 let page = handle
541- .event_context_after(&room_id, &token, limit)
565+ .mentions_page(cursor, if limit == 0 { 50 } else { limit.clamp(1, 50) })
542566 .await?;
543567 Ok(Reply::Json(json!(page)))
544568 }
569+ Request::MentionContext { room_id, event_id } => {
570+ let context = handle
571+ .mention_context(&parse_room_id(&room_id)?, &parse_event_id(&event_id)?)
572+ .await?;
573+ Ok(Reply::Json(json!(context)))
574+ }
575+ Request::RetryMentionContext { room_id, event_id } => {
576+ let context = handle
577+ .retry_mention_context(&parse_room_id(&room_id)?, &parse_event_id(&event_id)?)
578+ .await?;
579+ Ok(Reply::Json(json!(context)))
580+ }
581+ Request::SetMentionsRead { keys, read } => {
582+ if keys.len() > 5000 {
583+ return Err(CoreError::bad_request(
584+ "at most 5000 mention keys are allowed",
585+ ));
586+ }
587+ handle.set_mentions_read(keys, read).await?;
588+ Ok(Reply::Done)
589+ }
590+ Request::MarkMentionsReadThrough { boundary } => {
591+ handle.mark_mentions_read_through(boundary).await?;
592+ Ok(Reply::Done)
593+ }
594+ Request::RecoverMentions => {
595+ handle.recover_mentions().await?;
596+ Ok(Reply::Done)
597+ }
545598 Request::Join { room } => {
546599 let room = parse_room_or_alias(&room)?;
547600 let room_id = handle.join_room(room, Vec::new()).await?;
Modified file: crates/malice-server/src/routes.rs+7 additions−1 deletions
@@ -554,7 +554,13 @@ async fn post_command(
554554 let request = body.0;
555555 if !matches!(
556556 request,
557- Request::Kick { .. }
557+ Request::MentionsPage { .. }
558+ | Request::MentionContext { .. }
559+ | Request::RetryMentionContext { .. }
560+ | Request::SetMentionsRead { .. }
561+ | Request::MarkMentionsReadThrough { .. }
562+ | Request::RecoverMentions
563+ | Request::Kick { .. }
558564 | Request::Ban { .. }
559565 | Request::Unban { .. }
560566 | Request::SetPowerLevel { .. }