Server: - PostgreSQL backend (Pool enum over Sqlite/PgPool, all storage methods dual-dialect) - E2EE for DM (4 new protobuf packets, handlers, storage of ciphertext only) - ChannelEdit packet + server-authoritative channel create/delete - Gateway → voice-node membership signaling via broadcast channel Client: - E2EE crypto (X25519 from Ed25519, HKDF, ChaCha20-Poly1305) + UI lock icons - E2EE net layer (PID 0x0071-0x0074, JSON payloads, dispatch, session handlers) - Slint migration: all .slint files, bridge.rs, update.rs, main.rs rewritten - Removed egui UI (~50 files) and all dead code (clean clippy -D warnings)
182 lines
6.2 KiB
Rust
182 lines
6.2 KiB
Rust
#[repr(u16)]
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
pub enum PacketId {
|
|
Hello = 0x0001,
|
|
Auth = 0x0002,
|
|
Session = 0x0003,
|
|
Ping = 0x0004,
|
|
Pong = 0x0005,
|
|
VoicePacket = 0x0010,
|
|
VoiceState = 0x0011,
|
|
ChatMessage = 0x0020,
|
|
ChatHistory = 0x0021,
|
|
JoinChannel = 0x0030,
|
|
LeaveChannel = 0x0031,
|
|
ChannelState = 0x0032,
|
|
ChannelCreate = 0x0033,
|
|
ChannelDelete = 0x0034,
|
|
ChannelList = 0x0035,
|
|
ChannelEdit = 0x0036,
|
|
UserJoin = 0x0040,
|
|
UserLeave = 0x0041,
|
|
PermissionCheck = 0x0050,
|
|
PermissionDeny = 0x0051,
|
|
DmStart = 0x0060,
|
|
DmMessage = 0x0061,
|
|
DmHistory = 0x0062,
|
|
DmReadAck = 0x0063,
|
|
E2eeDmKeyExchange = 0x0071,
|
|
E2eeDmKeyExchangeAck = 0x0072,
|
|
E2eeDmMessage = 0x0073,
|
|
E2eeDmHistory = 0x0074,
|
|
ReadReceipt = 0x0064,
|
|
ReadReceiptBroadcast = 0x0065,
|
|
MessageReactionAdd = 0x0066,
|
|
MessageReactionRemove = 0x0067,
|
|
MessageEdit = 0x0068,
|
|
MessageDelete = 0x0069,
|
|
TypingStart = 0x0070,
|
|
GuildCreate = 0x0100,
|
|
GuildDelete = 0x0101,
|
|
GuildList = 0x0102,
|
|
GuildMemberJoin = 0x0103,
|
|
GuildMemberLeave = 0x0104,
|
|
GuildMemberKick = 0x0105,
|
|
RoleCreate = 0x0106,
|
|
RoleDelete = 0x0107,
|
|
InviteCreate = 0x0108,
|
|
InviteAccept = 0x0109,
|
|
InviteDelete = 0x010A,
|
|
UserRoleUpdate = 0x010B,
|
|
GuildAuditLogFetch = 0x010C,
|
|
GuildAuditLog = 0x010D,
|
|
GuildMemberListFetch = 0x010E,
|
|
GuildMemberList = 0x010F,
|
|
GuildRoleAssign = 0x0110,
|
|
GuildRoleUnassign = 0x0111,
|
|
GuildRoleListFetch = 0x0112,
|
|
GuildRoleList = 0x0113,
|
|
PresenceUpdate = 0x0140,
|
|
PresenceSync = 0x0141,
|
|
PresenceEvent = 0x0142,
|
|
FriendRequest = 0x0150,
|
|
FriendAccept = 0x0151,
|
|
FriendDecline = 0x0152,
|
|
FriendRemove = 0x0153,
|
|
FriendList = 0x0154,
|
|
BlockUser = 0x0155,
|
|
UnblockUser = 0x0156,
|
|
BlockList = 0x0157,
|
|
Error = 0x00F0,
|
|
Disconnect = 0x00FF,
|
|
}
|
|
|
|
impl PacketId {
|
|
pub fn from_u16(v: u16) -> Option<Self> {
|
|
match v {
|
|
0x0001 => Some(Self::Hello),
|
|
0x0002 => Some(Self::Auth),
|
|
0x0003 => Some(Self::Session),
|
|
0x0004 => Some(Self::Ping),
|
|
0x0005 => Some(Self::Pong),
|
|
0x0010 => Some(Self::VoicePacket),
|
|
0x0011 => Some(Self::VoiceState),
|
|
0x0020 => Some(Self::ChatMessage),
|
|
0x0021 => Some(Self::ChatHistory),
|
|
0x0030 => Some(Self::JoinChannel),
|
|
0x0031 => Some(Self::LeaveChannel),
|
|
0x0032 => Some(Self::ChannelState),
|
|
0x0033 => Some(Self::ChannelCreate),
|
|
0x0034 => Some(Self::ChannelDelete),
|
|
0x0035 => Some(Self::ChannelList),
|
|
0x0036 => Some(Self::ChannelEdit),
|
|
0x0040 => Some(Self::UserJoin),
|
|
0x0041 => Some(Self::UserLeave),
|
|
0x0050 => Some(Self::PermissionCheck),
|
|
0x0051 => Some(Self::PermissionDeny),
|
|
0x0060 => Some(Self::DmStart),
|
|
0x0061 => Some(Self::DmMessage),
|
|
0x0062 => Some(Self::DmHistory),
|
|
0x0063 => Some(Self::DmReadAck),
|
|
0x0064 => Some(Self::ReadReceipt),
|
|
0x0065 => Some(Self::ReadReceiptBroadcast),
|
|
0x0066 => Some(Self::MessageReactionAdd),
|
|
0x0067 => Some(Self::MessageReactionRemove),
|
|
0x0068 => Some(Self::MessageEdit),
|
|
0x0069 => Some(Self::MessageDelete),
|
|
0x0070 => Some(Self::TypingStart),
|
|
0x0071 => Some(Self::E2eeDmKeyExchange),
|
|
0x0072 => Some(Self::E2eeDmKeyExchangeAck),
|
|
0x0073 => Some(Self::E2eeDmMessage),
|
|
0x0074 => Some(Self::E2eeDmHistory),
|
|
0x0100 => Some(Self::GuildCreate),
|
|
0x0101 => Some(Self::GuildDelete),
|
|
0x0102 => Some(Self::GuildList),
|
|
0x0103 => Some(Self::GuildMemberJoin),
|
|
0x0104 => Some(Self::GuildMemberLeave),
|
|
0x0105 => Some(Self::GuildMemberKick),
|
|
0x0106 => Some(Self::RoleCreate),
|
|
0x0107 => Some(Self::RoleDelete),
|
|
0x0108 => Some(Self::InviteCreate),
|
|
0x0109 => Some(Self::InviteAccept),
|
|
0x010A => Some(Self::InviteDelete),
|
|
0x010B => Some(Self::UserRoleUpdate),
|
|
0x010C => Some(Self::GuildAuditLogFetch),
|
|
0x010D => Some(Self::GuildAuditLog),
|
|
0x010E => Some(Self::GuildMemberListFetch),
|
|
0x010F => Some(Self::GuildMemberList),
|
|
0x0110 => Some(Self::GuildRoleAssign),
|
|
0x0111 => Some(Self::GuildRoleUnassign),
|
|
0x0112 => Some(Self::GuildRoleListFetch),
|
|
0x0113 => Some(Self::GuildRoleList),
|
|
0x0140 => Some(Self::PresenceUpdate),
|
|
0x0141 => Some(Self::PresenceSync),
|
|
0x0142 => Some(Self::PresenceEvent),
|
|
0x0150 => Some(Self::FriendRequest),
|
|
0x0151 => Some(Self::FriendAccept),
|
|
0x0152 => Some(Self::FriendDecline),
|
|
0x0153 => Some(Self::FriendRemove),
|
|
0x0154 => Some(Self::FriendList),
|
|
0x0155 => Some(Self::BlockUser),
|
|
0x0156 => Some(Self::UnblockUser),
|
|
0x0157 => Some(Self::BlockList),
|
|
0x00F0 => Some(Self::Error),
|
|
0x00FF => Some(Self::Disconnect),
|
|
_ => None,
|
|
}
|
|
}
|
|
}
|
|
#[repr(u8)]
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
pub enum ErrorCode {
|
|
VersionMismatch = 0x01,
|
|
AuthFailed = 0x02,
|
|
SessionExpired = 0x03,
|
|
PermissionDenied = 0x04,
|
|
ChannelNotFound = 0x05,
|
|
RateLimited = 0x06,
|
|
InvalidPacket = 0x07,
|
|
NodeUnavailable = 0x08,
|
|
GuildNotFound = 0x09,
|
|
Blocked = 0x0A,
|
|
Internal = 0xFF,
|
|
}
|
|
|
|
impl ErrorCode {
|
|
pub fn from_u32(v: u32) -> Option<Self> {
|
|
match v {
|
|
0x01 => Some(Self::VersionMismatch),
|
|
0x02 => Some(Self::AuthFailed),
|
|
0x03 => Some(Self::SessionExpired),
|
|
0x04 => Some(Self::PermissionDenied),
|
|
0x05 => Some(Self::ChannelNotFound),
|
|
0x06 => Some(Self::RateLimited),
|
|
0x07 => Some(Self::InvalidPacket),
|
|
0x08 => Some(Self::NodeUnavailable),
|
|
0x09 => Some(Self::GuildNotFound),
|
|
0x0A => Some(Self::Blocked),
|
|
0xFF => Some(Self::Internal),
|
|
_ => None,
|
|
}
|
|
}
|
|
}
|