use authifier::AuthifierEvent;
use serde::{Deserialize, Serialize};
use revolt_models::v0::{
AppendMessage, Channel, Emoji, FieldsChannel, FieldsMember, FieldsRole, FieldsServer,
FieldsUser, FieldsWebhook, Member, MemberCompositeKey, Message, PartialChannel, PartialMember,
PartialMessage, PartialRole, PartialServer, PartialUser, PartialWebhook, Report, Server, User,
UserSettings, Webhook,
};
use revolt_result::Error;
use crate::Database;
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(tag = "error")]
pub enum WebSocketError {
LabelMe,
InternalError { at: String },
InvalidSession,
OnboardingNotFinished,
AlreadyAuthenticated,
MalformedData { msg: String },
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(untagged)]
pub enum Ping {
Binary(Vec<u8>),
Number(usize),
}
#[derive(Serialize)]
#[serde(untagged)]
pub enum ErrorEvent {
Error(WebSocketError),
APIError(Error),
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(tag = "type")]
pub enum EventV1 {
Bulk { v: Vec<EventV1> },
Authenticated,
Logout,
Ready {
users: Vec<User>,
servers: Vec<Server>,
channels: Vec<Channel>,
members: Vec<Member>,
emojis: Vec<Emoji>,
},
Pong { data: Ping },
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> },
ServerCreate {
id: String,
server: Server,
channels: Vec<Channel>,
emojis: Vec<Emoji>,
},
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>,
event_id: Option<String>,
},
UserRelationship { id: String, user: User },
UserSettingsUpdate { id: String, update: UserSettings },
UserPlatformWipe { user_id: String, flags: i32 },
EmojiCreate(Emoji),
EmojiDelete { id: String },
ReportCreate(Report),
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,
},
WebhookCreate(Webhook),
WebhookUpdate {
id: String,
data: PartialWebhook,
remove: Vec<FieldsWebhook>,
},
WebhookDelete { id: String },
Auth(AuthifierEvent),
}
impl EventV1 {
pub async fn p(self, channel: String) {
#[cfg(not(debug_assertions))]
redis_kiss::p(channel, self).await;
#[cfg(debug_assertions)]
info!("Publishing event to {channel}: {self:?}");
#[cfg(debug_assertions)]
redis_kiss::publish(channel, self).await.unwrap();
}
pub async fn p_user(self, id: String, db: &Database) {
self.clone().p(id.clone()).await;
if let Ok(members) = db.fetch_all_memberships(&id).await {
for member in members {
self.clone().p(member.id.server).await;
}
}
}
pub async fn private(self, id: String) {
self.p(format!("{id}!")).await;
}
pub async fn global(self) {
self.p("global".to_string()).await;
}
}