atagen

macltok

public
Star0
Watch0
8fd8dcf69c68a45d7ceb5d553230e1df3efada9d
3
ssh://brewery@pls.lobotomise.me:33/atagen/macltok.git
src/mentions_model.rsRust127 lines3.5 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, 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 incomplete_history: bool,
55
    pub gaps: Vec<MentionGap>,
56
    pub truncated: bool,
57
    pub unresolved_candidates: usize,
58
}
59
60
impl Default for MentionCoverage {
61
    fn default() -> Self {
62
        Self {
63
            earliest_timestamp_ms: None,
64
            historical_supported: None,
65
            recovering: false,
66
            incomplete_history: true,
67
            gaps: Vec::new(),
68
            truncated: false,
69
            unresolved_candidates: 0,
70
        }
71
    }
72
}
73
74
#[derive(Clone, Debug, Eq, PartialEq)]
75
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
76
pub struct MentionGap {
77
    pub room_id: Option<OwnedRoomId>,
78
    pub reason: String,
79
    pub token: Option<String>,
80
}
81
82
#[derive(Clone, Debug, Eq, PartialEq)]
83
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
84
pub struct MentionsBoundary {
85
    pub account: OwnedUserId,
86
    pub revision: u64,
87
}
88
89
#[derive(Clone, Debug, Eq, PartialEq)]
90
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
91
pub struct MentionsPage {
92
    pub entries: Vec<MentionEntry>,
93
    pub next_cursor: Option<String>,
94
    pub end_reached: bool,
95
    pub coverage: MentionCoverage,
96
    pub unread_count: usize,
97
    pub revision: u64,
98
    pub boundary: MentionsBoundary,
99
}
100
101
#[derive(Clone, Debug, Eq, PartialEq)]
102
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
103
pub struct SavedMentionContext {
104
    pub key: MentionKey,
105
    pub state: MentionCaptureState,
106
    pub context: Option<EventContext>,
107
    pub revision: u64,
108
}
109
110
#[derive(Clone, Debug, Eq, PartialEq)]
111
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
112
pub struct MentionsUpdate {
113
    pub snapshot: MentionsPage,
114
    pub upserts: Vec<MentionEntry>,
115
    pub removed: Vec<MentionKey>,
116
}
117
118
#[derive(Clone, Debug, Eq, PartialEq)]
119
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
120
pub enum MentionsCommand {
121
    Page { cursor: Option<String>, limit: u16 },
122
    Context(MentionKey),
123
    RetryContext(MentionKey),
124
    SetRead { keys: Vec<MentionKey>, read: bool },
125
    ReadThrough(MentionsBoundary),
126
    Recover,
127
}