use serde::{Deserialize, Serialize};
#[cfg(feature = "utoipa")]
use utoipa::{IntoParams, ToSchema};
use crate::v1::types::{
application::Connection, user_status::StatusPatch, util::Time, webhook::Webhook, ApplicationId,
AuditLogEntry, CalendarEventId, InviteTargetId, InviteWithMetadata, Relationship, RoomBan,
ThreadMember, WebhookId,
};
use super::{
calendar::CalendarEvent,
emoji::EmojiCustom,
notifications::{Notification, NotificationFlush, NotificationMarkRead},
reaction::ReactionKey,
role::RoleReorderItem,
user_config::{UserConfigChannel, UserConfigGlobal, UserConfigRoom, UserConfigUser},
voice::{SignallingMessage, VoiceState},
Channel, ChannelId, EmojiId, InviteCode, Message, MessageId, MessageVerId, Role, RoleId, Room,
RoomId, RoomMember, Session, SessionId, SessionToken, User, UserId,
};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[serde(tag = "type")]
pub enum MessageClient {
Hello {
token: SessionToken,
status: Option<StatusPatch>,
#[serde(flatten)]
resume: Option<SyncResume>,
},
Status { status: StatusPatch },
Pong,
VoiceDispatch {
user_id: UserId,
payload: SignallingMessage,
},
MemberListSubscribe {
room_id: Option<RoomId>,
thread_id: Option<ChannelId>,
ranges: Vec<(u64, u64)>,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct SyncResume {
pub conn: String,
pub seq: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct MessageEnvelope {
#[serde(flatten)]
pub payload: MessagePayload,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[serde(tag = "op")]
pub enum MessagePayload {
Ping,
Sync { data: Box<MessageSync>, seq: u64 },
Error { error: String },
Ready {
user: Box<Option<User>>,
session: Session,
conn: String,
seq: u64,
},
Resumed,
Reconnect { can_resume: bool },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[serde(tag = "type")]
pub enum MessageSync {
RoomCreate {
room: Room,
},
RoomUpdate {
room: Room,
},
RoomDelete {
room_id: RoomId,
},
ChannelCreate {
channel: Box<Channel>,
},
ChannelUpdate {
channel: Box<Channel>,
},
ChannelTyping {
channel_id: ChannelId,
user_id: UserId,
until: Time,
},
ChannelAck {
user_id: UserId,
channel_id: ChannelId,
message_id: MessageId,
version_id: MessageVerId,
},
MessageCreate {
message: Message,
},
MessageUpdate {
message: Message,
},
MessageDelete {
channel_id: ChannelId,
message_id: MessageId,
},
MessageVersionDelete {
channel_id: ChannelId,
message_id: MessageId,
version_id: MessageVerId,
},
MessageDeleteBulk {
channel_id: ChannelId,
message_ids: Vec<MessageId>,
},
MessageRemove {
channel_id: ChannelId,
message_ids: Vec<MessageId>,
},
MessageRestore {
channel_id: ChannelId,
message_ids: Vec<MessageId>,
},
RoomMemberUpsert {
member: RoomMember,
},
ThreadMemberUpsert {
member: ThreadMember,
},
RoleCreate {
role: Role,
},
RoleUpdate {
role: Role,
},
RoleDelete {
room_id: RoomId,
role_id: RoleId,
},
RoleReorder {
room_id: RoomId,
roles: Vec<RoleReorderItem>,
},
InviteCreate {
invite: InviteWithMetadata,
},
InviteUpdate {
invite: InviteWithMetadata,
},
InviteDelete {
code: InviteCode,
target: InviteTargetId,
},
ReactionCreate {
user_id: UserId,
channel_id: ChannelId,
message_id: MessageId,
key: ReactionKey,
},
ReactionDelete {
user_id: UserId,
channel_id: ChannelId,
message_id: MessageId,
key: ReactionKey,
},
ReactionPurge {
channel_id: ChannelId,
message_id: MessageId,
},
EmojiCreate {
emoji: EmojiCustom,
},
EmojiUpdate {
emoji: EmojiCustom,
},
EmojiDelete {
emoji_id: EmojiId,
room_id: RoomId,
},
VoiceDispatch {
user_id: UserId,
payload: SignallingMessage,
},
VoiceState {
user_id: UserId,
state: Option<VoiceState>,
#[serde(skip)]
old_state: Option<VoiceState>,
},
UserCreate {
user: User,
},
UserUpdate {
user: User,
},
UserConfigGlobal {
user_id: UserId,
config: UserConfigGlobal,
},
UserConfigRoom {
user_id: UserId,
room_id: RoomId,
config: UserConfigRoom,
},
UserConfigChannel {
user_id: UserId,
channel_id: ChannelId,
config: UserConfigChannel,
},
UserConfigUser {
user_id: UserId,
target_user_id: UserId,
config: UserConfigUser,
},
UserDelete {
id: UserId,
},
SessionCreate {
session: Session,
},
SessionUpdate {
session: Session,
},
SessionDelete {
id: SessionId,
user_id: Option<UserId>,
},
RelationshipUpsert {
user_id: UserId,
target_user_id: UserId,
relationship: Relationship,
},
RelationshipDelete {
user_id: UserId,
target_user_id: UserId,
},
ConnectionCreate {
user_id: UserId,
connection: Connection,
},
ConnectionDelete {
user_id: UserId,
app_id: ApplicationId,
},
AuditLogEntryCreate {
entry: AuditLogEntry,
},
BanCreate {
room_id: RoomId,
ban: RoomBan,
},
BanDelete {
room_id: RoomId,
user_id: UserId,
},
MemberListSync {
user_id: UserId,
room_id: Option<RoomId>,
channel_id: Option<ChannelId>,
ops: Vec<MemberListOp>,
groups: Vec<MemberListGroup>,
},
InboxNotificationCreate {
user_id: UserId,
notification: Notification,
},
InboxMarkRead {
user_id: UserId,
#[serde(flatten)]
params: NotificationMarkRead,
},
InboxMarkUnread {
user_id: UserId,
#[serde(flatten)]
params: NotificationMarkRead,
},
InboxFlush {
user_id: UserId,
#[serde(flatten)]
params: NotificationFlush,
},
CalendarEventCreate {
event: CalendarEvent,
},
CalendarEventUpdate {
event: CalendarEvent,
},
CalendarEventDelete {
channel_id: ChannelId,
event_id: CalendarEventId,
},
WebhookCreate {
webhook: Webhook,
},
WebhookUpdate {
webhook: Webhook,
},
WebhookDelete {
webhook_id: WebhookId,
room_id: Option<RoomId>,
channel_id: ChannelId,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[serde(tag = "type")]
pub enum MemberListOp {
Sync {
position: u64,
room_members: Option<Vec<RoomMember>>,
thread_members: Option<Vec<ThreadMember>>,
users: Vec<User>,
},
Insert {
position: u64,
room_member: Option<RoomMember>,
thread_member: Option<ThreadMember>,
user: Box<User>,
},
Delete {
position: u64,
count: u64,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub struct MemberListGroup {
pub id: MemberListGroupId,
pub count: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub enum MemberListGroupId {
Online,
Offline,
#[serde(untagged)]
Role(RoleId),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema, IntoParams))]
pub struct SyncParams {
pub version: SyncVersion,
pub compression: Option<SyncCompression>,
#[serde(default)]
pub format: SyncFormat,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
#[repr(u8)]
pub enum SyncVersion {
V1 = 1,
}
impl Serialize for SyncVersion {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
serializer.serialize_u8(*self as u8)
}
}
impl<'de> Deserialize<'de> for SyncVersion {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
match u8::deserialize(deserializer)? {
1 => Ok(SyncVersion::V1),
n => Err(serde::de::Error::unknown_variant(&n.to_string(), &["1"])),
}
}
}
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub enum SyncFormat {
#[default]
Json,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[cfg_attr(feature = "utoipa", derive(ToSchema))]
pub enum SyncCompression {
}