diff options
| -rw-r--r-- | src/message/signalproxy/mod.rs | 30 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/aliasmanager.rs | 11 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/backlogmanager.rs | 2 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/buffersyncer.rs | 6 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/bufferviewconfig.rs | 4 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/bufferviewmanager.rs | 5 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/certmanager.rs | 6 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/coreinfo.rs | 50 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/highlightrulemanager.rs | 63 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/identity.rs | 5 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/ignorelistmanager.rs | 6 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/mod.rs | 2 | ||||
| -rw-r--r-- | src/message/signalproxy/objects/network.rs | 26 |
13 files changed, 156 insertions, 60 deletions
diff --git a/src/message/signalproxy/mod.rs b/src/message/signalproxy/mod.rs index 6b96909..cc1fc54 100644 --- a/src/message/signalproxy/mod.rs +++ b/src/message/signalproxy/mod.rs @@ -37,11 +37,21 @@ pub struct SyncProxy { /// SyncProxy sends sync and rpc messages impl SyncProxy { /// Initialize the global SYNC_PROXY object and return receiver ends for the SyncMessage and RpcCall channels - pub fn init(cap: usize) -> (crossbeam_channel::Receiver<SyncMessage>, crossbeam_channel::Receiver<RpcCall>) { + pub fn init( + cap: usize, + ) -> ( + crossbeam_channel::Receiver<SyncMessage>, + crossbeam_channel::Receiver<RpcCall>, + ) { let (sync_tx, sync_rx) = crossbeam_channel::bounded(cap); let (rpc_tx, rpc_rx) = crossbeam_channel::bounded(cap); - SYNC_PROXY.set(SyncProxy { sync_channel: sync_tx, rpc_channel: rpc_tx }).unwrap(); + SYNC_PROXY + .set(SyncProxy { + sync_channel: sync_tx, + rpc_channel: rpc_tx, + }) + .unwrap(); (sync_rx, rpc_rx) } @@ -49,13 +59,13 @@ impl SyncProxy { /// Send a SyncMessage fn sync( &self, - class_name: &str, + class_name: Class, object_name: Option<&str>, function: &str, params: VariantList, ) { let msg = SyncMessage { - class_name: class_name.to_string(), + class_name, object_name: object_name.unwrap_or("").to_string(), slot_name: function.to_string(), params, @@ -77,7 +87,7 @@ impl SyncProxy { /// If the object name has to be set implement the send_sync() function. pub trait Syncable { /// The Class of the object as transmitted in the SyncMessage - const CLASS: &'static str; + const CLASS: Class; /// Send a SyncMessage. fn send_sync(&self, function: &str, params: VariantList) { @@ -96,6 +106,13 @@ pub trait Syncable { .unwrap() .rpc(function, params); } + + fn init(&mut self, data: Self) + where + Self: Sized, + { + *self = data + } } /// Methods for a Stateful Syncable object on the client side. @@ -157,7 +174,8 @@ pub trait StatefulSyncableClient: Syncable + translation::NetworkMap { } } - fn sync_custom(&mut self, msg: crate::message::SyncMessage) + #[allow(unused_mut)] + fn sync_custom(&mut self, mut msg: crate::message::SyncMessage) where Self: Sized, { diff --git a/src/message/signalproxy/objects/aliasmanager.rs b/src/message/signalproxy/objects/aliasmanager.rs index 6aa7b06..489d8c8 100644 --- a/src/message/signalproxy/objects/aliasmanager.rs +++ b/src/message/signalproxy/objects/aliasmanager.rs @@ -1,5 +1,8 @@ +#[allow(unused_imports)] +use libquassel_derive::sync; use libquassel_derive::{NetworkList, NetworkMap}; +use crate::message::Class; #[allow(unused_imports)] use crate::message::StatefulSyncableClient; #[allow(unused_imports)] @@ -15,7 +18,7 @@ use crate::primitive::VariantMap; /// AliasManager /// keeps a list of all registered aliases /// syncable -#[derive(Clone, Debug, std::cmp::PartialEq, NetworkList, NetworkMap)] +#[derive(Clone, Default, Debug, std::cmp::PartialEq, NetworkList, NetworkMap)] pub struct AliasManager { #[network(rename = "Aliases", variant = "VariantMap", network, map)] pub aliases: Vec<Alias>, @@ -23,7 +26,9 @@ pub struct AliasManager { impl AliasManager { pub fn add_alias(&mut self, alias: Alias) { - // TODO check if name is equal + #[cfg(feature = "server")] + sync!("addAlias", [alias.to_network_map()]); + if !self.aliases.contains(&alias) { self.aliases.push(alias) } @@ -49,7 +54,7 @@ impl StatefulSyncableServer for AliasManager { } impl Syncable for AliasManager { - const CLASS: &'static str = "AliasManager"; + const CLASS: Class = Class::AliasManager; } /// Alias diff --git a/src/message/signalproxy/objects/backlogmanager.rs b/src/message/signalproxy/objects/backlogmanager.rs index 86a7f61..7d6624d 100644 --- a/src/message/signalproxy/objects/backlogmanager.rs +++ b/src/message/signalproxy/objects/backlogmanager.rs @@ -52,7 +52,7 @@ use crate::primitive::VariantList; /// Receive and Request Backlog /// All "request" functions are Client to Server and all "receive" functions are Server to Client -#[derive(Clone, Debug, std::cmp::PartialEq)] +#[derive(Clone, Debug, std::cmp::PartialEq, Default)] pub struct BacklogManager {} impl BacklogManager { diff --git a/src/message/signalproxy/objects/buffersyncer.rs b/src/message/signalproxy/objects/buffersyncer.rs index ca68ade..9bca521 100644 --- a/src/message/signalproxy/objects/buffersyncer.rs +++ b/src/message/signalproxy/objects/buffersyncer.rs @@ -1,13 +1,13 @@ use std::collections::HashMap; use crate::{ - message::{signalproxy::translation::Network, Syncable}, + message::{signalproxy::translation::Network, Syncable, Class}, primitive::MessageType, }; use libquassel_derive::{sync, NetworkList, NetworkMap}; -#[derive(Debug, Clone, PartialEq, NetworkList, NetworkMap)] +#[derive(Default, Debug, Clone, PartialEq, NetworkList, NetworkMap)] pub struct BufferSyncer { #[network(rename = "Activities", network, variant = "VariantList")] pub activities: HashMap<i32, MessageType>, @@ -180,7 +180,7 @@ impl crate::message::StatefulSyncableServer for BufferSyncer { } impl Syncable for BufferSyncer { - const CLASS: &'static str = "BufferSyncer"; + const CLASS: Class = Class::BufferSyncer; } #[cfg(test)] diff --git a/src/message/signalproxy/objects/bufferviewconfig.rs b/src/message/signalproxy/objects/bufferviewconfig.rs index e413a5f..cdca0dc 100644 --- a/src/message/signalproxy/objects/bufferviewconfig.rs +++ b/src/message/signalproxy/objects/bufferviewconfig.rs @@ -7,7 +7,7 @@ use crate::message::signalproxy::translation::Network; use crate::message::StatefulSyncableClient; #[allow(unused_imports)] use crate::message::StatefulSyncableServer; -use crate::message::Syncable; +use crate::message::{Syncable, Class}; use crate::primitive::VariantList; @@ -206,7 +206,7 @@ impl StatefulSyncableServer for BufferViewConfig { } impl Syncable for BufferViewConfig { - const CLASS: &'static str = "BufferViewConfig"; + const CLASS: Class = Class::BufferViewConfig; fn send_sync(&self, function: &str, params: VariantList) { crate::message::signalproxy::SYNC_PROXY.get().unwrap().sync( diff --git a/src/message/signalproxy/objects/bufferviewmanager.rs b/src/message/signalproxy/objects/bufferviewmanager.rs index 63c48e4..0ea30f7 100644 --- a/src/message/signalproxy/objects/bufferviewmanager.rs +++ b/src/message/signalproxy/objects/bufferviewmanager.rs @@ -2,6 +2,7 @@ use std::collections::HashMap; use libquassel_derive::sync; +use crate::message::Class; #[allow(unused_imports)] use crate::message::StatefulSyncableClient; #[allow(unused_imports)] @@ -12,7 +13,7 @@ use crate::primitive::{Variant, VariantList, VariantMap}; use super::BufferViewConfig; -#[derive(Debug, Clone, PartialEq)] +#[derive(Debug, Clone, PartialEq, Default)] pub struct BufferViewManager { pub buffer_view_configs: HashMap<i32, BufferViewConfig>, } @@ -118,7 +119,7 @@ impl StatefulSyncableServer for BufferViewManager { } impl Syncable for BufferViewManager { - const CLASS: &'static str = "BufferViewManager"; + const CLASS: Class = Class::BufferViewManager; } impl super::NetworkList for BufferViewManager { diff --git a/src/message/signalproxy/objects/certmanager.rs b/src/message/signalproxy/objects/certmanager.rs index c82d06c..a518b7b 100644 --- a/src/message/signalproxy/objects/certmanager.rs +++ b/src/message/signalproxy/objects/certmanager.rs @@ -1,10 +1,10 @@ use libquassel_derive::{NetworkList, NetworkMap}; -use crate::message::Syncable; +use crate::message::{Syncable, Class}; #[allow(unused_imports)] use crate::primitive::Variant; -#[derive(Debug, Clone, PartialEq, NetworkList, NetworkMap)] +#[derive(Debug, Clone, PartialEq, NetworkList, NetworkMap, Default)] pub struct CertManager { #[network(rename = "sslKey", variant = "ByteArray")] pub ssl_key: String, @@ -46,5 +46,5 @@ impl crate::message::StatefulSyncableClient for CertManager { impl crate::message::StatefulSyncableServer for CertManager {} impl Syncable for CertManager { - const CLASS: &'static str = "CertManager"; + const CLASS: Class = Class::CertManager; } diff --git a/src/message/signalproxy/objects/coreinfo.rs b/src/message/signalproxy/objects/coreinfo.rs index ac493f1..9bfa728 100644 --- a/src/message/signalproxy/objects/coreinfo.rs +++ b/src/message/signalproxy/objects/coreinfo.rs @@ -1,14 +1,14 @@ use libquassel_derive::{NetworkList, NetworkMap}; use crate::message::signalproxy::translation::NetworkMap; -use crate::message::Syncable; +use crate::message::{Syncable, Class}; use crate::primitive::{DateTime, StringList}; -#[derive(Debug, Clone, PartialEq, NetworkList, NetworkMap)] +#[derive(Default, Debug, Clone, PartialEq, NetworkList, NetworkMap)] #[network(repr = "map")] pub struct CoreInfo { #[network(rename = "coreData", variant = "VariantMap", network)] - core_data: CoreData, + pub core_data: CoreData, } impl CoreInfo { @@ -51,48 +51,60 @@ impl crate::message::StatefulSyncableServer for CoreInfo { } impl Syncable for CoreInfo { - const CLASS: &'static str = "CoreInfo"; + const CLASS: Class = Class::CoreInfo; } #[derive(Debug, Clone, PartialEq, NetworkMap)] #[network(repr = "map")] pub struct CoreData { #[network(rename = "quasselVersion")] - quassel_version: String, + pub quassel_version: String, #[network(rename = "quasselBuildDate")] - quassel_build_date: String, + pub quassel_build_date: String, #[network(rename = "startTime")] - start_time: DateTime, + pub start_time: DateTime, #[network(rename = "sessionConnectedClients")] - session_connected_clients: i32, + pub session_connected_clients: i32, #[network( rename = "sessionConnectedClientData", variant = "VariantList", network, map )] - session_connected_client_data: Vec<ConnectedClient>, + pub session_connected_client_data: Vec<ConnectedClient>, +} + +impl Default for CoreData { + fn default() -> Self { + Self { + quassel_version: Default::default(), + quassel_build_date: Default::default(), + start_time:DateTime::unix_epoch(), + session_connected_clients: Default::default(), + session_connected_client_data: Default::default(), + } + } } #[derive(Debug, Clone, PartialEq, NetworkMap)] #[network(repr = "map")] pub struct ConnectedClient { #[network(rename = "id")] - id: i32, + pub id: i32, #[network(rename = "remoteAddress")] - remote_address: String, - #[network(rename = "location")] - location: String, + pub remote_address: String, + // #[network(rename = "location")] + // location: String, #[network(rename = "clientVersion")] - client_version: String, + pub client_version: String, #[network(rename = "clientVersionDate")] - client_version_date: String, + pub client_version_date: String, #[network(rename = "connectedSince")] - connected_since: DateTime, + pub connected_since: DateTime, #[network(rename = "secure")] - secure: bool, + pub secure: bool, #[network(rename = "features")] - features: i32, + pub features: u32, #[network(rename = "featureList")] - feature_list: StringList, + pub feature_list: StringList, } diff --git a/src/message/signalproxy/objects/highlightrulemanager.rs b/src/message/signalproxy/objects/highlightrulemanager.rs index 3bd09ad..dc1fff9 100644 --- a/src/message/signalproxy/objects/highlightrulemanager.rs +++ b/src/message/signalproxy/objects/highlightrulemanager.rs @@ -4,6 +4,7 @@ use num_traits::{FromPrimitive, ToPrimitive}; use libquassel_derive::{NetworkList, NetworkMap}; +use crate::message::Class; use crate::message::signalproxy::translation::{Network, NetworkMap}; #[allow(unused_imports)] @@ -13,7 +14,7 @@ use crate::message::StatefulSyncableServer; use crate::message::Syncable; -#[derive(Debug, Clone, PartialEq, NetworkList, NetworkMap)] +#[derive(Default, Debug, Clone, PartialEq, NetworkList, NetworkMap)] pub struct HighlightRuleManager { #[network(rename = "HighlightRuleList", variant = "VariantMap", network, map)] highlight_rule_list: Vec<HighlightRule>, @@ -205,7 +206,7 @@ impl StatefulSyncableServer for HighlightRuleManager { } impl Syncable for HighlightRuleManager { - const CLASS: &'static str = "HighlightRuleManager"; + const CLASS: Class = Class::HighlightRuleManager; } #[derive(Debug, Clone, PartialEq, NetworkMap)] @@ -214,13 +215,13 @@ pub struct HighlightRule { id: i32, #[network(variant = "StringList")] name: String, - #[network(rename = "isRegEx")] + #[quassel(name = "isRegEx")] is_regex: bool, - #[network(rename = "isCaseSensitive")] + #[quassel(name = "isCaseSensitive")] is_case_sensitive: bool, - #[network(rename = "isEnabled")] + #[quassel(name = "isEnabled")] is_enabled: bool, - #[network(rename = "isInverse")] + #[quassel(name = "isInverse")] is_inverse: bool, #[network(variant = "StringList")] sender: String, @@ -228,8 +229,9 @@ pub struct HighlightRule { channel: String, } -#[derive(Debug, Clone, PartialEq, FromPrimitive, ToPrimitive)] +#[derive(Default, Debug, Clone, PartialEq, FromPrimitive, ToPrimitive)] pub enum HighlightNickType { + #[default] NoNick = 0x00, CurrentNick = 0x01, AllNicks = 0x02, @@ -253,20 +255,20 @@ mod tests { use crate::message::signalproxy::translation::NetworkList; use crate::primitive::{Variant, VariantList}; - use pretty_assertions::assert_eq; + // use pretty_assertions::assert_eq; fn get_network() -> VariantList { vec![ Variant::ByteArray(s!("HighlightRuleList")), Variant::VariantMap(map! { - s!("isInverse") => Variant::VariantList(vec![Variant::bool(false)]), + s!("id") => Variant::VariantList(vec![Variant::i32(1)]), + s!("name") => Variant::StringList(vec![s!("testrule")]), + s!("isRegEx") => Variant::VariantList(vec![Variant::bool(false)]), + s!("isCaseSensitive") => Variant::VariantList(vec![Variant::bool(false)]), s!("isEnabled") => Variant::VariantList(vec![Variant::bool(true)]), - s!("channel") => Variant::StringList(vec![s!("#test")]), + s!("isInverse") => Variant::VariantList(vec![Variant::bool(false)]), s!("sender") => Variant::StringList(vec![s!("testuser")]), - s!("isCaseSensitive") => Variant::VariantList(vec![Variant::bool(false)]), - s!("isRegEx") => Variant::VariantList(vec![Variant::bool(false)]), - s!("name") => Variant::StringList(vec![s!("testrule")]), - s!("id") => Variant::VariantList(vec![Variant::i32(1)]), + s!("channel") => Variant::StringList(vec![s!("#test")]), }), Variant::ByteArray(s!("highlightNick")), Variant::i32(1), @@ -275,6 +277,39 @@ mod tests { ] } + + +// [ +// ByteArray("HighlightRuleList"), +// VariantMap({ +// "isCaseSensitive": VariantList([bool(false)]), +// "isEnabled": VariantList([bool(true)]), +// "": StringList(["#test"]), +// "isRegEx": VariantList([bool(false)]), +// "isInverse": VariantList([bool(false)])}), +// ByteArray("highlightNick"), +// i32(1), +// ByteArray("nicksCaseSensitive"), +// bool(false) +// ] + +// [ +// ByteArray("HighlightRuleList"), +// VariantMap({ +// "name": StringList(["testrule"]), +// "isEnabled": VariantList([bool(true)]), +// "sender": StringList(["testuser"]), +// "isInverse": VariantList([bool(false)]), +// "isCaseSensitive": VariantList([bool(false)]), +// "isRegEx": VariantList([bool(false)]), +// "id": VariantList([i32(1)]), +// "channel": StringList(["#test"])}), +// ByteArray("highlightNick"), +// i32(1), +// ByteArray("nicksCaseSensitive"), +// bool(false) +// ] + fn get_runtime() -> HighlightRuleManager { HighlightRuleManager { highlight_rule_list: vec![HighlightRule { diff --git a/src/message/signalproxy/objects/identity.rs b/src/message/signalproxy/objects/identity.rs index de89105..a61c8d2 100644 --- a/src/message/signalproxy/objects/identity.rs +++ b/src/message/signalproxy/objects/identity.rs @@ -2,6 +2,7 @@ use libquassel_derive::sync; use libquassel_derive::{NetworkList, NetworkMap, Setters}; +use crate::message::Class; #[allow(unused_imports)] use crate::message::StatefulSyncableClient; #[allow(unused_imports)] @@ -12,7 +13,7 @@ use crate::message::Syncable; #[allow(unused_imports)] use crate::message::signalproxy::translation::NetworkMap; -#[derive(Debug, Clone, PartialEq, NetworkMap, NetworkList, Setters)] +#[derive(Default, Debug, Clone, PartialEq, NetworkMap, NetworkList, Setters)] pub struct Identity { #[quassel(name = "identityId")] identity_id: i32, @@ -100,7 +101,7 @@ impl StatefulSyncableClient for Identity { impl StatefulSyncableServer for Identity {} impl Syncable for Identity { - const CLASS: &'static str = "Identity"; + const CLASS: Class = Class::Identity; fn send_sync(&self, function: &str, params: crate::primitive::VariantList) { crate::message::signalproxy::SYNC_PROXY.get().unwrap().sync( diff --git a/src/message/signalproxy/objects/ignorelistmanager.rs b/src/message/signalproxy/objects/ignorelistmanager.rs index a58de04..19d07d5 100644 --- a/src/message/signalproxy/objects/ignorelistmanager.rs +++ b/src/message/signalproxy/objects/ignorelistmanager.rs @@ -1,11 +1,11 @@ use crate::message::{ signalproxy::translation::{Network, NetworkMap}, - Syncable, + Syncable, Class, }; use libquassel_derive::{sync, NetworkList, NetworkMap}; -#[derive(Debug, Clone, PartialEq, NetworkList, NetworkMap)] +#[derive(Default, Debug, Clone, PartialEq, NetworkList, NetworkMap)] pub struct IgnoreListManager { #[quassel(name = "IgnoreList")] #[network(variant = "VariantMap", network, map)] @@ -175,7 +175,7 @@ impl crate::message::StatefulSyncableServer for IgnoreListManager { } impl Syncable for IgnoreListManager { - const CLASS: &'static str = "IgnoreListManager"; + const CLASS: Class = Class::IgnoreListManager; } #[derive(Debug, Clone, PartialEq, NetworkMap)] diff --git a/src/message/signalproxy/objects/mod.rs b/src/message/signalproxy/objects/mod.rs index 664d46c..521a591 100644 --- a/src/message/signalproxy/objects/mod.rs +++ b/src/message/signalproxy/objects/mod.rs @@ -1,5 +1,6 @@ mod aliasmanager; mod buffersyncer; +mod backlogmanager; mod bufferviewmanager; mod bufferviewconfig; mod certmanager; @@ -14,6 +15,7 @@ mod networkinfo; pub use aliasmanager::*; pub use buffersyncer::*; +pub use backlogmanager::*; pub use bufferviewmanager::*; pub use bufferviewconfig::*; pub use certmanager::*; diff --git a/src/message/signalproxy/objects/network.rs b/src/message/signalproxy/objects/network.rs index 4985bd9..266a1be 100644 --- a/src/message/signalproxy/objects/network.rs +++ b/src/message/signalproxy/objects/network.rs @@ -29,6 +29,14 @@ pub struct Network { } impl Network { + pub fn get_channel_mode_type(&self, mode: char) -> ChannelModeType { + if let Some((mode_type, _)) = self.channel_modes.iter().find(|(_, v)| v.contains(mode)) { + *mode_type + } else { + ChannelModeType::NotAChanmode + } + } + /// The `channel_modes` field is populated by the ``supports["CHANMODES"]` string, /// which is represented as the channel mode types a,b,c,d in a comma sepperated string. fn determine_channel_mode_types(&mut self) { @@ -383,6 +391,20 @@ mod tests { } #[test] + fn network_get_channel_mode_type() { + let mut network = Network::default(); + + network.supports.insert(s!("CHANMODES"), s!("IXZbegw,k,FHJLWdfjlx,ABCDKMNOPQRSTcimnprstuz")); + network.determine_channel_mode_types(); + + assert_eq!(network.get_channel_mode_type('b'), ChannelModeType::AChanmode); + assert_eq!(network.get_channel_mode_type('k'), ChannelModeType::BChanmode); + assert_eq!(network.get_channel_mode_type('W'), ChannelModeType::CChanmode); + assert_eq!(network.get_channel_mode_type('D'), ChannelModeType::DChanmode); + assert_eq!(network.get_channel_mode_type('E'), ChannelModeType::NotAChanmode); + } + + #[test] fn network_determine_prefixes() { let mut network = Network::default(); network.determine_prefixes(); @@ -418,9 +440,9 @@ impl Default for ConnectionState { } #[allow(dead_code)] -#[derive(Debug, Clone, Eq, Hash, PartialEq, FromPrimitive, ToPrimitive)] +#[derive(Debug, Copy, Clone, Eq, Hash, PartialEq, FromPrimitive, ToPrimitive)] #[repr(C)] -enum ChannelModeType { +pub enum ChannelModeType { NotAChanmode = 0x00, AChanmode = 0x01, BChanmode = 0x02, |
