use wincode::{ SchemaWrite, SchemaRead };
use crate::
{
role::Role,
network::schema::
{
Offer,
BoxedOffer,
Reply,
BoxedReply,
},
};
#[derive(SchemaWrite, SchemaRead, Clone)]
pub enum PacketCode {
MessageRequest
{
text: String,
},
Message
{
text: String,
username: String,
id: usize,
colors: MessageColors,
},
KeyExchangeOffer
{
#[wincode(with = "BoxedOffer")]
offer: Box<Offer>,
},
KeyExchangeReply
{
#[wincode(with = "BoxedReply")]
reply: Box<Reply>,
},
Welcome
{
min_pass: u64,
max_uname: u64,
min_uname: u64,
server_name: String,
server_uname: String,
git_hash: String,
},
Username
{
username: String,
device: Option<Device>,
},
Accept
{
id: usize,
role: Role,
},
Join
{
username: String,
username_color: Option<u8>,
id: usize,
device: Option<Device>,
},
Leave
{
username: String,
id: usize,
},
PrivateMessageRequest
{
text: String,
id: usize,
},
PrivateMessage
{
text: String,
username: String,
id: usize,
},
PrivateMessageBack
{
text: String,
username: String,
id: usize,
},
VoiceJoin
{
username: String,
id: usize,
},
Upload
{
hash: [u8; 32],
token: [u8; 32],
uid: u64,
},
DownloadRequest
{
id: usize,
file_id: usize,
},
ImageRequest
{
hash: [u8; 32],
filename: String,
},
Image
{
hash: [u8; 32],
token: [u8; 32],
uid: u64,
},
ImageDisplay
{
username: String,
filename: String,
hash: [u8; 32],
data: Option<Vec<u8>>,
username_color: Option<u8>,
},
ImageData
{
hash: [u8; 32],
data: Vec<u8>,
},
Uploaded
{
filename: String,
username: String,
},
Attach
{
username: String,
token: [u8; 32],
},
List
{
online: Vec<OnlineUser>,
offline: Option<Vec<OfflineUser>>,
},
ServerBans
{
users: Vec<BanEntry>,
ips: Vec<BanEntry>,
},
ServerRoleRequest
{
id: usize, role: Role, },
ServerRole
{
id: usize, role: Role, username: Option<String>, },
Colors
{
username: bool, color: u8,
},
ServerSettings
{
settings: Vec<ServerSetting>,
save: bool, },
Version { version: String }, UsernameRequest, LoginRequest, RegisterRequest, Login { password: String }, Register { password: String }, History { messages: Vec<StoredMessage> }, Channel { channel: Option<String> }, ChannelCreated { name: String }, ChannelDestroyed { name: String }, VoiceClients { clients: Vec<(usize, String)> }, VoiceLeave { id: usize }, UploadRequest { hash: [u8; 32] }, Download { token: [u8; 32] }, ImageDuplicate { hash: [u8; 32] }, ImageDataRequest { hash: [u8; 32] }, FilesRequest, ListRequest, ScreensRequest, DeattachRequest, ScreenRequest, AttachRequest { id: usize }, VoiceRequest, ServerBansRequest, ServerSettingsRequest, Files { users: Vec<UserFile> }, Screens { users: Vec<UserScreen> }, Deattach { username: String }, Attached { username: String }, Deattached { username: String }, Screen { token: Option<[u8; 32]> }, Screenshare { username: String }, ScreenshareEnd { username: String }, Voice { token: Option<[u8; 32]> },
ServerKick { id: usize }, ServerMute { id: usize }, ServerBan { id: usize }, ServerBanIp { id: usize }, ServerPardon { id: usize }, ServerPardonIp { id: usize }, ServerSay { message: String }, ServerSettingsSave { settings: Vec<ServerSetting> },
FirstUser, Rekey, Disconnect, SpamWarning, RegisterDisabled, UploadLimit, Muted, InvalidUsage, InvalidFeature, KeepAlive, ServerRestart, }
impl PacketCode
{
pub fn name(&self) -> &'static str
{
match self
{
Self::MessageRequest { .. } => "MessageRequest",
Self::Message { .. } => "Message",
Self::KeyExchangeOffer { .. } => "KeyExchangeOffer",
Self::KeyExchangeReply { .. } => "KeyExchangeReply",
Self::Welcome { .. } => "Welcome",
Self::Accept { .. } => "Accept",
Self::Leave { .. } => "Leave",
Self::PrivateMessageRequest { .. } => "PrivateMessageRequest",
Self::PrivateMessage { .. } => "PrivateMessage",
Self::PrivateMessageBack { .. } => "PrivateMessageBack",
Self::VoiceJoin { .. } => "VoiceJoin",
Self::VoiceLeave { .. } => "VoiceLeave",
Self::UploadRequest { .. } => "UploadRequest",
Self::Upload { .. } => "Upload",
Self::DownloadRequest { .. } => "DownloadRequest",
Self::Download { .. } => "Download",
Self::ImageRequest { .. } => "ImageRequest",
Self::ImageDuplicate { .. } => "ImageDuplicate",
Self::Image { .. } => "Image",
Self::ImageDisplay { .. } => "ImageDisplay",
Self::ImageDataRequest { .. } => "ImageDataRequest",
Self::ImageData { .. } => "ImageData",
Self::Uploaded { .. } => "Uploaded",
Self::AttachRequest { .. } => "AttachRequest",
Self::Attach { .. } => "Attach",
Self::ServerBansRequest { .. } => "ServerBansRequest",
Self::ServerBans { .. } => "ServerBans",
Self::ServerRoleRequest { .. } => "ServerRoleRequest",
Self::ServerRole { .. } => "ServerRole",
Self::ServerSettingsRequest { .. } => "ServerSettingsRequest",
Self::ServerSettingsSave { .. } => "ServerSettingsSave",
Self::ServerSettings { .. } => "ServerSettings",
Self::Colors { .. } => "Colors",
Self::Version { .. } => "Version",
Self::UsernameRequest { .. } => "UsernameRequest",
Self::Username { .. } => "Username",
Self::LoginRequest { .. } => "LoginRequest",
Self::Login { .. } => "Login",
Self::RegisterRequest { .. } => "RegisterRequest",
Self::Register { .. } => "Register",
Self::History { .. } => "History",
Self::Channel { .. } => "Channel",
Self::ChannelCreated { .. } => "ChannelCreated",
Self::ChannelDestroyed { .. } => "ChannelDestroyed",
Self::VoiceClients { .. } => "VoiceClients",
Self::FilesRequest { .. } => "FilesRequest",
Self::Files { .. } => "Files",
Self::ScreensRequest { .. } => "ScreensRequest",
Self::Screens { .. } => "Screens",
Self::DeattachRequest { .. } => "DeattachRequest",
Self::Deattach { .. } => "Deattach",
Self::Attached { .. } => "Attached",
Self::Deattached { .. } => "Deattached",
Self::ScreenRequest { .. } => "ScreenRequest",
Self::Screen { .. } => "Screen",
Self::Screenshare { .. } => "Screenshare",
Self::ScreenshareEnd { .. } => "ScreenshareEnd",
Self::VoiceRequest { .. } => "VoiceRequest",
Self::Voice { .. } => "Voice",
Self::Join { .. } => "Join",
Self::ListRequest { .. } => "ListRequest",
Self::List { .. } => "List",
Self::ServerKick { .. } => "ServerKick",
Self::ServerMute { .. } => "ServerMute",
Self::ServerBan { .. } => "ServerBan",
Self::ServerBanIp { .. } => "ServerBanIp",
Self::ServerPardon { .. } => "ServerPardon",
Self::ServerPardonIp { .. } => "ServerPardonIp",
Self::ServerSay { .. } => "ServerSay",
Self::FirstUser { .. } => "FirstUser",
Self::Rekey { .. } => "Rekey",
Self::Disconnect { .. } => "Disconnect",
Self::SpamWarning { .. } => "SpamWarning",
Self::RegisterDisabled { .. } => "RegisterDisabled",
Self::UploadLimit { .. } => "UploadLimit",
Self::Muted { .. } => "Muted",
Self::InvalidUsage { .. } => "InvalidUsage",
Self::InvalidFeature { .. } => "InvalidFeature",
Self::KeepAlive { .. } => "KeepAlive",
Self::ServerRestart { .. } => "ServerRestart",
}
}
}
#[derive(SchemaWrite, SchemaRead, Clone, PartialEq)]
pub struct ServerSetting
{
pub key: String,
pub value: SettingValue,
pub section: String, pub description: String, pub restart: bool, }
#[derive(SchemaWrite, SchemaRead, Clone, PartialEq)]
pub enum SettingValue
{
Toggle(bool),
Number(i64),
Text(String),
}
#[derive(SchemaWrite, SchemaRead, Clone, PartialEq)]
pub struct StoredMessage
{
pub username: String,
pub text: String, pub colors: MessageColors,
pub image: Option<[u8; 32]>, }
#[derive(SchemaWrite, SchemaRead, Clone, PartialEq)]
pub struct MessageColors {
pub username_color: Option<u8>, pub message_color: Option<u8>, }
#[derive(SchemaWrite, SchemaRead, Clone, PartialEq)]
pub struct UserFile {
pub username: String,
pub id: usize,
pub upload: Vec<(String, usize)>,
}
#[derive(SchemaWrite, SchemaRead, Clone, PartialEq)]
pub struct UserScreen {
pub username: String,
pub id: usize,
}
#[derive(SchemaWrite, SchemaRead, Clone, PartialEq)]
pub struct BanEntry {
pub id: usize,
pub subject: String,
}
#[derive(SchemaWrite, SchemaRead, Clone, PartialEq)]
pub struct OnlineUser {
pub username: String,
pub username_color: Option<u8>,
pub id: usize,
pub channel: Option<String>,
pub device: Option<Device>,
}
#[derive(SchemaWrite, SchemaRead, Clone, PartialEq)]
pub struct OfflineUser {
pub username: String,
pub username_color: Option<u8>,
}
#[derive(SchemaWrite, SchemaRead, Clone, PartialEq)]
pub enum Device
{
TUI,
Desktop,
Phone,
}