use authifier::AuthifierEvent; use serde::{Deserialize, Serialize}; use crate::models::channel::{FieldsChannel, PartialChannel}; use crate::models::message::{AppendMessage, PartialMessage}; use crate::models::server::{FieldsRole, FieldsServer, PartialRole, PartialServer}; use crate::models::server_member::{FieldsMember, MemberCompositeKey, PartialMember}; use crate::models::user::{FieldsUser, PartialUser, RelationshipStatus}; use crate::models::{Channel, Emoji, Member, Message, Server, User, UserSettings}; use crate::Error; /// WebSocket Client Errors #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(tag = "error")] pub enum WebSocketError { LabelMe, InternalError { at: String }, InvalidSession, OnboardingNotFinished, AlreadyAuthenticated, MalformedData { msg: String }, } /// Ping Packet #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(untagged)] pub enum Ping { Binary(Vec), Number(usize), } /// Untagged Error #[derive(Serialize)] #[serde(untagged)] pub enum ErrorEvent { Error(WebSocketError), APIError(Error), } /// Protocol Events #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(tag = "type")] pub enum EventV1 { /// Multiple events Bulk { v: Vec }, /// Successfully authenticated Authenticated, /// Basic data to cache Ready { users: Vec, servers: Vec, channels: Vec, members: Vec, emojis: Option>, }, /// Ping response Pong { data: Ping }, /// New message Message(Message), /// Update existing message MessageUpdate { id: String, channel: String, data: PartialMessage, }, /// Append information to existing message MessageAppend { id: String, channel: String, append: AppendMessage, }, /// Delete message MessageDelete { id: String, channel: String }, /// New reaction to a message MessageReact { id: String, channel_id: String, user_id: String, emoji_id: String, }, /// Remove user's reaction from message MessageUnreact { id: String, channel_id: String, user_id: String, emoji_id: String, }, /// Remove a reaction from message MessageRemoveReaction { id: String, channel_id: String, emoji_id: String, }, /// Bulk delete messages BulkMessageDelete { channel: String, ids: Vec }, /// New channel ChannelCreate(Channel), /// Update existing channel ChannelUpdate { id: String, data: PartialChannel, clear: Vec, }, /// Delete channel ChannelDelete { id: String }, /// User joins a group ChannelGroupJoin { id: String, user: String }, /// User leaves a group ChannelGroupLeave { id: String, user: String }, /// User started typing in a channel ChannelStartTyping { id: String, user: String }, /// User stopped typing in a channel ChannelStopTyping { id: String, user: String }, /// User acknowledged message in channel ChannelAck { id: String, user: String, message_id: String, }, /// New server ServerCreate { id: String, server: Server, channels: Vec, }, /// Update existing server ServerUpdate { id: String, data: PartialServer, clear: Vec, }, /// Delete server ServerDelete { id: String }, /// Update existing server member ServerMemberUpdate { id: MemberCompositeKey, data: PartialMember, clear: Vec, }, /// User joins server ServerMemberJoin { id: String, user: String }, /// User left server ServerMemberLeave { id: String, user: String }, /// Server role created or updated ServerRoleUpdate { id: String, role_id: String, data: PartialRole, clear: Vec, }, /// Server role deleted ServerRoleDelete { id: String, role_id: String }, /// Update existing user UserUpdate { id: String, data: PartialUser, clear: Vec, }, /// Relationship with another user changed UserRelationship { id: String, user: User, // ! this field can be deprecated status: RelationshipStatus, }, /// Settings updated remotely UserSettingsUpdate { id: String, update: UserSettings }, /// 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 { user_id: String, flags: i32 }, /// New emoji EmojiCreate(Emoji), /// Delete emoji EmojiDelete { id: String }, /// Auth events Auth(AuthifierEvent), }