atagen

macltok

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