tuwunel_service/pusher/
badge.rs1use std::{
11 collections::{BTreeMap, HashMap},
12 sync::{Mutex, MutexGuard, PoisonError},
13};
14
15use ruma::{OwnedUserId, UInt, UserId};
16use tuwunel_core::implement;
17
18type Badges = HashMap<OwnedUserId, BTreeMap<String, UInt>>;
19
20#[derive(Default)]
21pub(super) struct SentBadges {
22 inner: Mutex<Badges>,
23}
24
25#[implement(super::Service)]
30pub(super) fn sent_badge(&self, user_id: &UserId, pushkey: &str) -> Option<UInt> {
31 self.sent_badges
32 .lock()
33 .get(user_id)
34 .and_then(|pushkeys| pushkeys.get(pushkey))
35 .copied()
36}
37
38impl SentBadges {
39 fn lock(&self) -> MutexGuard<'_, Badges> {
40 self.inner
41 .lock()
42 .unwrap_or_else(PoisonError::into_inner)
43 }
44}
45
46#[implement(super::Service)]
51pub(super) fn record_sent_badge(&self, user_id: &UserId, pushkey: &str, unread: UInt) {
52 self.sent_badges
53 .lock()
54 .entry(user_id.to_owned())
55 .or_default()
56 .insert(pushkey.to_owned(), unread);
57}
58
59#[implement(super::Service)]
64pub(super) fn forget_sent_badge(&self, user_id: &UserId, pushkey: &str) {
65 let mut badges = self.sent_badges.lock();
66 let Some(pushkeys) = badges.get_mut(user_id) else {
67 return;
68 };
69
70 pushkeys.remove(pushkey);
71
72 if pushkeys.is_empty() {
73 badges.remove(user_id);
74 }
75}