1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509
use serde::{Deserialize, Serialize};
use crate::{
channel::{Channel, FieldsChannel, PartialChannel},
emoji::Emoji,
member::{FieldsMember, Member, MemberCompositeKey, PartialMember},
message::{AppendMessage, Message, PartialMessage},
report::Report,
server::{FieldsRole, FieldsServer, PartialRole, PartialServer, Server},
user::{FieldsUser, PartialUser, RelationshipStatus, User, UserSettings},
webhook::{FieldsWebhook, PartialWebhook, Webhook},
};
#[derive(Deserialize, Debug, Clone, Eq, PartialEq)]
#[serde(tag = "type")]
pub enum ErrorId {
LabelMe,
InternalError {
at: String,
},
InvalidSenssion,
OnboardingNotFinished,
AlreadyAuthenticated,
MalformedData {
msg: String,
},
#[serde(other)]
Unknown,
}
/// Event sent by server
#[derive(Deserialize, Debug, Clone)]
#[serde(tag = "type")]
pub enum ServerEvent {
/// Multiple events
Bulk(BulkEvent),
/// Error
Error(ErrorEvent),
/// Successfully authenticated
Authenticated,
/// Basic data to cache
Ready(ReadyEvent),
/// Ping response
Pong(PongEvent),
/// New message
Message(Message),
/// Update existing message
MessageUpdate(MessageUpdateEvent),
/// Append information to existing message
MessageAppend(MessageAppendEvent),
/// Delete message
MessageDelete(MessageDeleteEvent),
/// New reaction to a message
MessageReact(MessageReactEvent),
/// Remove user's reaction from message
MessageUnreact(MessageUnreactEvent),
/// Remove a reaction from message
MessageRemoveReaction(MessageRemoveReactionEvent),
/// Bulk delete messages
BulkMessageDelete(BulkMessageDeleteEvent),
/// New channel
ChannelCreate(Channel),
/// Update existing channel
ChannelUpdate(ChannelUpdateEvent),
/// Delete channel
ChannelDelete(ChannelDeleteEvent),
/// User joins a group
ChannelGroupJoin(ChannelGroupJoinEvent),
/// User leaves a group
ChannelGroupLeave(ChannelGroupLeaveEvent),
/// User started typing in a channel
ChannelStartTyping(ChannelStartTypingEvent),
/// User stopped typing in a channel
ChannelStopTyping(ChannelStopTypingEvent),
/// User acknowledged message in channel
ChannelAck(ChannelAckEvent),
/// New server
ServerCreate(ServerCreateEvent),
/// Update existing server
ServerUpdate(ServerUpdateEvent),
/// Delete server
ServerDelete(ServerDeleteEvent),
/// Update existing server member
ServerMemberUpdate(ServerMemberUpdateEvent),
/// User joins server
ServerMemberJoin(ServerMemberJoinEvent),
/// User left server
ServerMemberLeave(ServerMemberLeaveEvent),
/// Server role created or updated
ServerRoleUpdate(ServerRoleUpdateEvent),
/// Server role deleted
ServerRoleDelete(ServerRoleDeleteEvent),
/// Update existing user
UserUpdate(UserUpdateEvent),
/// Relationship with another user changed
UserRelationship(UserRelationshipEvent),
/// Settings updated remotely
UserSettingsUpdate(UserSettingsUpdateEvent),
/// User has been platform banned or deleted their account
///
/// Clients should remove the following associated data:
/// - Messages
/// - DM Channels
/// - Relationships
/// - Server Memberships
///
/// User flags are specified to explain why a wipe is occurring though not all reasons will necessarily ever appear.
UserPlatformWipe(UserPlatformWipeEvent),
/// New emoji
EmojiCreate(Emoji),
/// Delete emoji
EmojiDelete(EmojiDeleteEvent),
/// New webhook
WebhookCreate(Webhook),
/// Update existing webhook
WebhookUpdate(WebhookUpdateEvent),
/// Delete webhook
WebhookDelete(WebhookDeleteEvent),
/// New report
ReportCreate(Report),
/// Auth event
Auth(AuthifierEvent),
/// Unknown event
///
/// If you received this event, please open an issue!
#[serde(other)]
Unknown,
}
/// Event sent by client
#[derive(Serialize, Debug, Clone, Eq, PartialEq)]
#[serde(tag = "type")]
pub enum ClientEvent {
Authenticate { token: String },
Ping { data: i32 },
BeginTyping { channel: String },
EndTyping { channel: String },
}
/// Authentication related events
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(tag = "event_type")]
pub enum AuthifierEvent {
DeleteSession {
user_id: String,
session_id: String,
},
DeleteAllSessions {
user_id: String,
exclude_session_id: Option<String>,
},
}
/// Bulk event data
#[derive(Deserialize, Debug, Clone)]
pub struct BulkEvent {
/// List of events
pub v: Vec<ServerEvent>,
}
/// Error event data
#[derive(Deserialize, Debug, Clone)]
pub struct ErrorEvent {
/// Error ID
pub error: ErrorId,
}
/// Ready event data
#[derive(Deserialize, Debug, Clone)]
pub struct ReadyEvent {
/// List of users
pub users: Vec<User>,
/// List of servers
pub servers: Vec<Server>,
/// List of channels
pub channels: Vec<Channel>,
/// List of server members
pub members: Vec<Member>,
/// List of emojis
pub emojis: Option<Vec<Emoji>>,
}
/// Server pong event data
#[derive(Deserialize, Debug, Clone)]
pub struct PongEvent {
/// Client echo data
pub data: u32,
}
/// Message update event data
#[derive(Deserialize, Debug, Clone)]
pub struct MessageUpdateEvent {
/// Message ID
pub id: String,
/// Channel ID
pub channel: String,
/// Changed message data
pub data: PartialMessage,
}
/// Message append event data
#[derive(Deserialize, Debug, Clone)]
pub struct MessageAppendEvent {
/// Message ID
pub id: String,
/// Channel ID
pub channel: String,
/// Appended message information
pub append: AppendMessage,
}
/// Message delete event data
#[derive(Deserialize, Debug, Clone)]
pub struct MessageDeleteEvent {
/// Message ID
pub id: String,
/// Channel ID
pub channel: String,
}
/// Message react event data
#[derive(Deserialize, Debug, Clone)]
pub struct MessageReactEvent {
/// Message ID
pub id: String,
/// Channel ID
pub channel_id: String,
/// Reaction author ID
pub user_id: String,
/// Emoji ID
pub emoji_id: String,
}
/// Message reaction remove event
#[derive(Deserialize, Debug, Clone)]
pub struct MessageUnreactEvent {
/// Message ID
pub id: String,
/// Channel ID
pub channel_id: String,
/// Reaction author ID
pub user_id: String,
/// Emoji ID
pub emoji_id: String,
}
/// Message remove reaction event data
#[derive(Deserialize, Debug, Clone)]
pub struct MessageRemoveReactionEvent {
/// Message ID
pub id: String,
/// Channel ID
pub channel_id: String,
/// Emoji ID
pub emoji_id: String,
}
/// Bulk message delete event data
#[derive(Deserialize, Debug, Clone)]
pub struct BulkMessageDeleteEvent {
/// Channel ID
pub channel: String,
/// List of messages IDs
pub ids: Vec<String>,
}
/// Channel update event data
#[derive(Deserialize, Debug, Clone)]
pub struct ChannelUpdateEvent {
pub id: String,
pub data: PartialChannel,
pub clear: Vec<FieldsChannel>,
}
/// Channel delete event data
#[derive(Deserialize, Debug, Clone)]
pub struct ChannelDeleteEvent {
/// Deleted channel ID
pub id: String,
}
/// Group join event data
#[derive(Deserialize, Debug, Clone)]
pub struct ChannelGroupJoinEvent {
/// Group ID
pub id: String,
/// User ID
pub user: String,
}
/// Group leave event data
#[derive(Deserialize, Debug, Clone)]
pub struct ChannelGroupLeaveEvent {
/// Group ID
pub id: String,
/// User ID
pub user: String,
}
/// Channel start typing event data
#[derive(Deserialize, Debug, Clone)]
pub struct ChannelStartTypingEvent {
/// Channel ID
pub id: String,
/// Typing user ID
pub user: String,
}
/// Channel stop typing event data
#[derive(Deserialize, Debug, Clone)]
pub struct ChannelStopTypingEvent {
/// Channel ID
pub id: String,
/// Typing user ID
pub user: String,
}
/// Channel acknowledge event data
#[derive(Deserialize, Debug, Clone)]
pub struct ChannelAckEvent {
/// Channel ID
pub id: String,
/// User ID
pub user: String,
/// Message ID
pub message_id: String,
}
/// New server data
#[derive(Deserialize, Debug, Clone)]
pub struct ServerCreateEvent {
/// Server ID
pub id: String,
/// Server information
pub server: Server,
/// List of server channels
pub channels: Vec<Channel>,
}
/// Server update data
#[derive(Deserialize, Debug, Clone)]
pub struct ServerUpdateEvent {
/// Server ID
pub id: String,
/// Server changed data
pub data: PartialServer,
/// List of removed optional server fields
pub clear: Vec<FieldsServer>,
}
/// Server delete event data
#[derive(Deserialize, Debug, Clone)]
pub struct ServerDeleteEvent {
/// Deleted server ID
pub id: String,
}
/// Server member update event data
#[derive(Deserialize, Debug, Clone)]
pub struct ServerMemberUpdateEvent {
/// Member ID
pub id: MemberCompositeKey,
/// Member changed data
pub data: PartialMember,
/// List of removed optional member fields
pub clear: Vec<FieldsMember>,
}
/// Member join event data
#[derive(Deserialize, Debug, Clone)]
pub struct ServerMemberJoinEvent {
/// Server ID
pub id: String,
/// User ID
pub user: String,
}
/// Server member leave event data
#[derive(Deserialize, Debug, Clone)]
pub struct ServerMemberLeaveEvent {
/// Server ID
pub id: String,
/// Leaved user ID
pub user: String,
}
/// Server role update event data
#[derive(Deserialize, Debug, Clone)]
pub struct ServerRoleUpdateEvent {
/// Server ID
pub id: String,
/// Role ID
pub role_id: String,
/// Changed role data
pub data: PartialRole,
/// Removed role optional fields
pub clear: Vec<FieldsRole>,
}
/// Server role delete event data
#[derive(Deserialize, Debug, Clone)]
pub struct ServerRoleDeleteEvent {
/// Server ID
pub id: String,
/// Role ID
pub role_id: String,
}
/// User update event data
#[derive(Deserialize, Debug, Clone)]
pub struct UserUpdateEvent {
/// User ID
pub id: String,
/// Changed user data
pub data: PartialUser,
/// Removed user fields
pub clear: Vec<FieldsUser>,
}
/// User relationship update event data
#[derive(Deserialize, Debug, Clone)]
pub struct UserRelationshipEvent {
pub id: String,
/// User with whom relationship changed
pub user: User,
/// New relationship status
pub status: RelationshipStatus,
}
/// Settings update event data
#[derive(Deserialize, Debug, Clone)]
pub struct UserSettingsUpdateEvent {
pub id: String,
/// Updated settings
pub update: UserSettings,
}
/// User wipe event data
#[derive(Deserialize, Debug, Clone)]
pub struct UserPlatformWipeEvent {
/// Deleted user ID
pub user_id: String,
/// User flags
pub flags: i32,
}
/// Emoji delete event data
#[derive(Deserialize, Debug, Clone)]
pub struct EmojiDeleteEvent {
/// Deleted emoji ID
pub id: String,
}
/// Webhook update event data
#[derive(Deserialize, Debug, Clone)]
pub struct WebhookUpdateEvent {
/// Webhook ID
pub id: String,
/// Updated webhook data
pub data: PartialWebhook,
/// Fields removed from webhook
pub remove: Vec<FieldsWebhook>,
}
/// Webhook delete event data
#[derive(Deserialize, Debug, Clone)]
pub struct WebhookDeleteEvent {
pub id: String,
}