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 }, /// 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 }, /// New emoji EmojiCreate(Emoji), /// Delete emoji EmojiDelete { id: String }, }