use serde::{Deserialize, Serialize};
use crate::{
channel::{Channel, FieldsChannel, PartialChannel},
emoji::Emoji,
member::{FieldsMember, Member, MemberCompositeKey, PartialMember},
message::{AppendMessage, Message, PartialMessage},
server::{FieldsRole, FieldsServer, PartialRole, PartialServer, Server},
user::{FieldsUser, PartialUser, RelationshipStatus, User, UserSettings},
};
#[derive(Deserialize, Debug, Clone, Eq, PartialEq)]
#[serde(tag = "type")]
#[cfg_attr(debug_assertions, serde(deny_unknown_fields))]
pub enum ErrorId {
LabelMe,
InternalError { at: String },
InvalidSenssion,
OnboardingNotFinished,
AlreadyAuthenticated,
MalformedData { msg: String },
}
#[derive(Deserialize, Debug, Clone)]
#[serde(tag = "type")]
pub enum ServerEvent {
Bulk { v: Vec<ServerEvent> },
Error { error: ErrorId },
Authenticated,
Ready {
users: Vec<User>,
servers: Vec<Server>,
channels: Vec<Channel>,
members: Vec<Member>,
emojis: Option<Vec<Emoji>>,
},
Pong { data: u32 },
Message(Message),
MessageUpdate {
id: String,
channel: String,
data: PartialMessage,
},
MessageAppend {
id: String,
channel: String,
append: AppendMessage,
},
MessageDelete { id: String, channel: String },
MessageReact {
id: String,
channel_id: String,
user_id: String,
emoji_id: String,
},
MessageUnreact {
id: String,
channel_id: String,
user_id: String,
emoji_id: String,
},
MessageRemoveReaction {
id: String,
channel_id: String,
emoji_id: String,
},
BulkMessageDelete { channel: String, ids: Vec<String> },
ChannelCreate(Channel),
ChannelUpdate {
id: String,
data: PartialChannel,
clear: Vec<FieldsChannel>,
},
ChannelDelete { id: String },
ChannelGroupJoin { id: String, user: String },
ChannelGroupLeave { id: String, user: String },
ChannelStartTyping { id: String, user: String },
ChannelStopTyping { id: String, user: String },
ChannelAck {
id: String,
user: String,
message_id: String,
},
ServerCreate {
id: String,
server: Server,
channels: Vec<Channel>,
},
ServerUpdate {
id: String,
data: PartialServer,
clear: Vec<FieldsServer>,
},
ServerDelete { id: String },
ServerMemberUpdate {
id: MemberCompositeKey,
data: PartialMember,
clear: Vec<FieldsMember>,
},
ServerMemberJoin { id: String, user: String },
ServerMemberLeave { id: String, user: String },
ServerRoleUpdate {
id: String,
role_id: String,
data: PartialRole,
clear: Vec<FieldsRole>,
},
ServerRoleDelete { id: String, role_id: String },
UserUpdate {
id: String,
data: PartialUser,
clear: Vec<FieldsUser>,
},
UserRelationship {
id: String,
user: User,
status: RelationshipStatus,
},
UserSettingsUpdate { id: String, update: UserSettings },
UserPlatformWipe { user_id: String, flags: i32 },
EmojiCreate(Emoji),
EmojiDelete { id: String },
#[serde(other)]
Unknown,
}
#[derive(Serialize, Debug, Clone, Eq, PartialEq)]
#[serde(tag = "type")]
pub enum ClientEvent {
Authenticate { token: String },
Ping { data: i32 },
BeginTyping { channel: String },
EndTyping { channel: String },
}