1use authifier::AuthifierEvent;
2use revolt_result::Error;
3use serde::{Deserialize, Serialize};
4
5use revolt_models::v0::{
6 AppendMessage, Channel, ChannelUnread, Emoji, FieldsChannel, FieldsMember, FieldsMessage,
7 FieldsRole, FieldsServer, FieldsUser, FieldsWebhook, Member, MemberCompositeKey, Message,
8 PartialChannel, PartialMember, PartialMessage, PartialRole, PartialServer, PartialUser,
9 PartialWebhook, PolicyChange, RemovalIntention, Report, Server, User, UserSettings, Webhook,
10};
11
12use crate::Database;
13
14#[derive(Serialize, Deserialize, Debug, Clone)]
16#[serde(untagged)]
17pub enum Ping {
18 Binary(Vec<u8>),
19 Number(usize),
20}
21
22#[derive(PartialEq)]
24pub enum ReadyPayloadFields {
25 Users,
26 Servers,
27 Channels,
28 Members,
29 Emoji,
30
31 UserSettings(Vec<String>),
32 ChannelUnreads,
33}
34
35#[derive(Serialize, Deserialize, Debug, Clone)]
37#[serde(tag = "type")]
38pub enum EventV1 {
39 Bulk { v: Vec<EventV1> },
41 Error { data: Error },
43
44 Authenticated,
46 Logout,
48 Ready {
50 #[serde(skip_serializing_if = "Option::is_none")]
51 users: Option<Vec<User>>,
52 #[serde(skip_serializing_if = "Option::is_none")]
53 servers: Option<Vec<Server>>,
54 #[serde(skip_serializing_if = "Option::is_none")]
55 channels: Option<Vec<Channel>>,
56 #[serde(skip_serializing_if = "Option::is_none")]
57 members: Option<Vec<Member>>,
58 #[serde(skip_serializing_if = "Option::is_none")]
59 emojis: Option<Vec<Emoji>>,
60
61 #[serde(skip_serializing_if = "Option::is_none")]
62 user_settings: Option<UserSettings>,
63 #[serde(skip_serializing_if = "Option::is_none")]
64 channel_unreads: Option<Vec<ChannelUnread>>,
65
66 policy_changes: Vec<PolicyChange>,
67 },
68
69 Pong { data: Ping },
71 Message(Message),
73
74 MessageUpdate {
76 id: String,
77 channel: String,
78 data: PartialMessage,
79 #[serde(default)]
80 clear: Vec<FieldsMessage>,
81 },
82
83 MessageAppend {
85 id: String,
86 channel: String,
87 append: AppendMessage,
88 },
89
90 MessageDelete { id: String, channel: String },
92
93 MessageReact {
95 id: String,
96 channel_id: String,
97 user_id: String,
98 emoji_id: String,
99 },
100
101 MessageUnreact {
103 id: String,
104 channel_id: String,
105 user_id: String,
106 emoji_id: String,
107 },
108
109 MessageRemoveReaction {
111 id: String,
112 channel_id: String,
113 emoji_id: String,
114 },
115
116 BulkMessageDelete { channel: String, ids: Vec<String> },
118
119 ServerCreate {
121 id: String,
122 server: Server,
123 channels: Vec<Channel>,
124 emojis: Vec<Emoji>,
125 },
126
127 ServerUpdate {
129 id: String,
130 data: PartialServer,
131 #[serde(default)]
132 clear: Vec<FieldsServer>,
133 },
134
135 ServerDelete { id: String },
137
138 ServerMemberUpdate {
140 id: MemberCompositeKey,
141 data: PartialMember,
142 #[serde(default)]
143 clear: Vec<FieldsMember>,
144 },
145
146 ServerMemberJoin { id: String, user: String },
148
149 ServerMemberLeave {
151 id: String,
152 user: String,
153 reason: RemovalIntention,
154 },
155
156 ServerRoleUpdate {
158 id: String,
159 role_id: String,
160 data: PartialRole,
161 #[serde(default)]
162 clear: Vec<FieldsRole>,
163 },
164
165 ServerRoleDelete { id: String, role_id: String },
167
168 ServerRoleRanksUpdate { id: String, ranks: Vec<String> },
170
171 UserUpdate {
173 id: String,
174 data: PartialUser,
175 #[serde(default)]
176 clear: Vec<FieldsUser>,
177 event_id: Option<String>,
178 },
179
180 UserRelationship { id: String, user: User },
182 UserSettingsUpdate { id: String, update: UserSettings },
184
185 UserPlatformWipe { user_id: String, flags: i32 },
195 EmojiCreate(Emoji),
197
198 EmojiDelete { id: String },
200
201 ReportCreate(Report),
203 ChannelCreate(Channel),
205
206 ChannelUpdate {
208 id: String,
209 data: PartialChannel,
210 #[serde(default)]
211 clear: Vec<FieldsChannel>,
212 },
213
214 ChannelDelete { id: String },
216
217 ChannelGroupJoin { id: String, user: String },
219
220 ChannelGroupLeave { id: String, user: String },
222
223 ChannelStartTyping { id: String, user: String },
225
226 ChannelStopTyping { id: String, user: String },
228
229 ChannelAck {
231 id: String,
232 user: String,
233 message_id: String,
234 },
235
236 WebhookCreate(Webhook),
238
239 WebhookUpdate {
241 id: String,
242 data: PartialWebhook,
243 remove: Vec<FieldsWebhook>,
244 },
245
246 WebhookDelete { id: String },
248
249 Auth(AuthifierEvent),
251}
252
253impl EventV1 {
254 pub async fn p(self, channel: String) {
256 #[cfg(not(debug_assertions))]
257 redis_kiss::p(channel, self).await;
258
259 #[cfg(debug_assertions)]
260 info!("Publishing event to {channel}: {self:?}");
261
262 #[cfg(debug_assertions)]
263 redis_kiss::publish(channel, self).await.unwrap();
264 }
265
266 pub async fn p_user(self, id: String, db: &Database) {
268 self.clone().p(id.clone()).await;
269
270 if let Ok(members) = db.fetch_all_memberships(&id).await {
272 for member in members {
273 self.clone().server(member.id.server).await;
274 }
275 }
276 }
277
278 pub async fn private(self, id: String) {
280 self.p(format!("{id}!")).await;
281 }
282
283 pub async fn server(self, id: String) {
285 self.p(format!("{id}u")).await;
286 }
287
288 pub async fn global(self) {
290 self.p("global".to_string()).await;
291 }
292}