atagen

macltok

public
Star0
Watch0
0e081dee5e28debddd20b865cc576862c03a2a66
3
ssh://brewery@pls.lobotomise.me:33/atagen/macltok.git
src/mentions_model.rsRust133 lines3.8 KB
1
use ruma::{OwnedEventId, OwnedRoomId, OwnedUserId};
2
#[cfg(feature = "serde")]
3
use serde::{Deserialize, Serialize};
4
5
use crate::{EventContext, TimelineItem};
6
7
#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
8
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9
pub struct MentionKey {
10
    pub room_id: OwnedRoomId,
11
    pub event_id: OwnedEventId,
12
}
13
14
#[derive(Clone, Debug, Eq, PartialEq)]
15
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
16
pub enum MentionReason {
17
    Direct,
18
    Reply,
19
    Room,
20
    /// a highlighting push rule matched with no structured mention or reply, such as a
21
    /// notification keyword
22
    Keyword,
23
}
24
25
#[derive(Clone, Debug, Eq, PartialEq)]
26
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
27
pub enum MentionCaptureState {
28
    Pending,
29
    Partial,
30
    Ready,
31
    Unavailable,
32
    Failed { message: String, retry_at_ms: u64 },
33
}
34
35
#[derive(Clone, Debug, Eq, PartialEq)]
36
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
37
pub struct MentionEntry {
38
    pub key: MentionKey,
39
    pub timestamp_ms: u64,
40
    pub discovered_at_ms: u64,
41
    pub discovery_revision: u64,
42
    pub revision: u64,
43
    pub event: TimelineItem,
44
    pub reasons: Vec<MentionReason>,
45
    pub read: bool,
46
    pub capture: MentionCaptureState,
47
    pub room_name: Option<String>,
48
    pub notification_suppressed: bool,
49
}
50
51
#[derive(Clone, Debug, Default, Eq, PartialEq)]
52
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
53
pub struct MentionCoverage {
54
    pub earliest_timestamp_ms: Option<u64>,
55
    pub historical_supported: Option<bool>,
56
    pub recovering: bool,
57
    pub gaps: Vec<MentionGap>,
58
    pub truncated: bool,
59
    pub unresolved_candidates: usize,
60
}
61
62
#[derive(Clone, Debug, Eq, PartialEq)]
63
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
64
pub struct MentionGap {
65
    pub room_id: Option<OwnedRoomId>,
66
    pub reason: MentionGapReason,
67
    pub token: Option<String>,
68
}
69
70
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
71
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
72
pub enum MentionGapReason {
73
    SyncDiscontinuity,
74
    /// an already observed room came back limited, `token` is its `prev_batch`
75
    LimitedTimeline,
76
    RoomLeft,
77
    ContextUnavailable,
78
    NotificationHistoryUnavailable,
79
    /// a candidate stayed undecryptable or unresolved for a week and was dropped
80
    CandidateExpired,
81
    StoreReset,
82
    /// a write failed, the inbox carries on in memory and a restart loses the unwritten part
83
    StoreFailed,
84
    HookTimedOut,
85
}
86
87
#[derive(Clone, Debug, Eq, PartialEq)]
88
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
89
pub struct MentionsBoundary {
90
    pub account: OwnedUserId,
91
    pub revision: u64,
92
}
93
94
#[derive(Clone, Debug, Eq, PartialEq)]
95
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
96
pub struct MentionsPage {
97
    pub entries: Vec<MentionEntry>,
98
    pub next_cursor: Option<String>,
99
    pub end_reached: bool,
100
    pub coverage: MentionCoverage,
101
    pub unread_count: usize,
102
    pub revision: u64,
103
    pub boundary: MentionsBoundary,
104
}
105
106
#[derive(Clone, Debug, Eq, PartialEq)]
107
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
108
pub struct SavedMentionContext {
109
    pub key: MentionKey,
110
    pub state: MentionCaptureState,
111
    pub context: Option<EventContext>,
112
    pub revision: u64,
113
}
114
115
#[derive(Clone, Debug, Eq, PartialEq)]
116
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
117
pub struct MentionsUpdate {
118
    pub snapshot: MentionsPage,
119
    pub upserts: Vec<MentionEntry>,
120
    pub removed: Vec<MentionKey>,
121
}
122
123
#[derive(Clone, Debug, Eq, PartialEq)]
124
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
125
#[non_exhaustive]
126
pub enum MentionsCommand {
127
    Page { cursor: Option<String>, limit: u16 },
128
    Context(MentionKey),
129
    RetryContext(MentionKey),
130
    SetRead { keys: Vec<MentionKey>, read: bool },
131
    ReadThrough(MentionsBoundary),
132
    Recover,
133
}