diff options
Diffstat (limited to 'src/message/signalproxy/objects/ircchannel.rs')
| -rw-r--r-- | src/message/signalproxy/objects/ircchannel.rs | 323 |
1 files changed, 47 insertions, 276 deletions
diff --git a/src/message/signalproxy/objects/ircchannel.rs b/src/message/signalproxy/objects/ircchannel.rs index bbdc600..105f318 100644 --- a/src/message/signalproxy/objects/ircchannel.rs +++ b/src/message/signalproxy/objects/ircchannel.rs @@ -2,38 +2,24 @@ use std::collections::HashMap; #[cfg(feature = "server")] use libquassel_derive::sync; -use libquassel_derive::Setters; +use libquassel_derive::{NetworkMap, Setters}; use log::{error, warn}; -use crate::message::{NetworkMap, Syncable, Class}; -use crate::primitive::{StringList, Variant, VariantList, VariantMap}; +use crate::message::{Class, Syncable}; +use crate::primitive::StringList; -use super::ChannelModeType; +use super::{ChanModes, ChannelModeType}; #[allow(dead_code)] -#[derive(Debug, Clone, PartialEq, Setters)] +#[derive(Debug, Clone, PartialEq, Setters, NetworkMap)] +#[network(repr = "maplist")] pub struct IrcChannel { - /// Modes that add or remove items from a list, like commonly +b for the banlist. - /// - /// Always require a parameter from server to client. - /// Clients can request the whole list by leaving the parameter empty - #[setter(skip)] - pub channel_modes_a: HashMap<char, StringList>, - - /// Modes that take a parameter as setting and require it when setting or removing the mode. - #[setter(skip)] - pub channel_modes_b: HashMap<char, String>, - - /// Modes that take a parameter as setting, but only require it when setting the mode. - #[setter(skip)] - pub channel_modes_c: HashMap<char, String>, - - /// Modes without a parameter. - #[setter(skip)] - pub channel_modes_d: String, + #[network(rename = "ChanModes", network = "map")] + pub chan_modes: ChanModes, // pub channel_modes: HashMap<char, ChannelMode>, #[setter(skip)] + #[network(rename = "UserModes", network = "map")] pub user_modes: HashMap<String, String>, #[setter(skip)] pub name: String, @@ -49,38 +35,43 @@ impl IrcChannel { match mode_type { ChannelModeType::NotAChanmode => (), ChannelModeType::AChanmode => { - self.channel_modes_a.insert(mode, vec![value]); - }, + self.chan_modes.channel_modes_a.insert(mode, vec![value]); + } ChannelModeType::BChanmode => { - self.channel_modes_b.insert(mode, value); - }, + self.chan_modes.channel_modes_b.insert(mode, value); + } ChannelModeType::CChanmode => { - self.channel_modes_c.insert(mode, value); - }, + self.chan_modes.channel_modes_c.insert(mode, value); + } ChannelModeType::DChanmode => { - if ! self.channel_modes_d.contains(mode) { - self.channel_modes_d.push(mode); + if !self.chan_modes.channel_modes_d.contains(mode) { + self.chan_modes.channel_modes_d.push(mode); }; - }, + } }; } pub fn remove_channel_mode(&mut self, mode_type: ChannelModeType, mode: char, value: String) { match mode_type { ChannelModeType::NotAChanmode => (), ChannelModeType::AChanmode => { - self.channel_modes_a.remove(&mode); - }, + self.chan_modes.channel_modes_a.remove(&mode); + } ChannelModeType::BChanmode => { - self.channel_modes_b.remove(&mode); - }, + self.chan_modes.channel_modes_b.remove(&mode); + } ChannelModeType::CChanmode => { - self.channel_modes_c.remove(&mode); - }, + self.chan_modes.channel_modes_c.remove(&mode); + } ChannelModeType::DChanmode => { - if self.channel_modes_d.contains(mode) { - self.channel_modes_d = self.channel_modes_d.chars().filter(|c| *c != mode).collect(); + if self.chan_modes.channel_modes_d.contains(mode) { + self.chan_modes.channel_modes_d = self + .chan_modes + .channel_modes_d + .chars() + .filter(|c| *c != mode) + .collect(); }; - }, + } } } @@ -206,242 +197,28 @@ impl Syncable for IrcChannel { const CLASS: Class = Class::IrcChannel; } -impl NetworkMap for Vec<IrcChannel> { - type Item = VariantMap; - - fn to_network_map(&self) -> Self::Item { - let mut channelmodes: VariantList = Vec::with_capacity(self.len()); - let mut usermodes: VariantList = Vec::with_capacity(self.len()); - let mut name: VariantList = Vec::with_capacity(self.len()); - let mut topic: VariantList = Vec::with_capacity(self.len()); - let mut password: VariantList = Vec::with_capacity(self.len()); - let mut encrypted: VariantList = Vec::with_capacity(self.len()); - - let mut map = VariantMap::new(); - - self.iter().for_each(|item| { - channelmodes.push(Variant::VariantMap({ - let mut map = VariantMap::new(); - - map.insert( - s!("A"), - Variant::VariantMap( - item.channel_modes_a - .iter() - .map(|(k, v)| (k.to_string(), Variant::StringList(v.clone()))) - .collect(), - ), - ); - map.insert( - s!("B"), - Variant::VariantMap( - item.channel_modes_b - .iter() - .map(|(k, v)| (k.to_string(), Variant::String(v.clone()))) - .collect(), - ), - ); - map.insert( - s!("C"), - Variant::VariantMap( - item.channel_modes_c - .iter() - .map(|(k, v)| (k.to_string(), Variant::String(v.clone()))) - .collect(), - ), - ); - map.insert(s!("D"), Variant::String(item.channel_modes_d.clone())); - - map - })); - - usermodes.push(Variant::VariantMap( - item.user_modes - .iter() - .map(|(k, v)| (k.clone(), Variant::String(v.clone()))) - .collect(), - )); - name.push(Variant::String(item.name.clone())); - topic.push(Variant::String(item.topic.clone())); - password.push(Variant::String(item.password.clone())); - encrypted.push(Variant::bool(item.encrypted)); - }); - - map.insert( - String::from("ChanModes"), - Variant::VariantList(channelmodes), - ); - map.insert(String::from("UserModes"), Variant::VariantList(usermodes)); - map.insert(String::from("name"), Variant::VariantList(name)); - map.insert(String::from("topic"), Variant::VariantList(topic)); - map.insert(String::from("password"), Variant::VariantList(password)); - map.insert(String::from("encrypted"), Variant::VariantList(encrypted)); - - map - } - - fn from_network_map(input: &mut Self::Item) -> Self { - let marker: VariantList = - std::convert::TryInto::try_into(input.get("name").unwrap()).unwrap(); - - let mut res = Vec::new(); - for _ in 0..marker.len() { - res.push(IrcChannel::from_network_map(input)); - } - - return res; - } -} - -impl NetworkMap for IrcChannel { - type Item = VariantMap; - - fn to_network_map(&self) -> Self::Item { - let mut res = VariantMap::new(); - - res.insert( - s!("ChanModes"), - Variant::VariantList({ - let mut map = VariantMap::new(); - - map.insert( - s!("A"), - Variant::VariantMap( - self.channel_modes_a - .iter() - .map(|(k, v)| (k.to_string(), Variant::StringList(v.clone()))) - .collect(), - ), - ); - map.insert( - s!("B"), - Variant::VariantMap( - self.channel_modes_b - .iter() - .map(|(k, v)| (k.to_string(), Variant::String(v.clone()))) - .collect(), - ), - ); - map.insert( - s!("C"), - Variant::VariantMap( - self.channel_modes_c - .iter() - .map(|(k, v)| (k.to_string(), Variant::String(v.clone()))) - .collect(), - ), - ); - map.insert(s!("D"), Variant::String(self.channel_modes_d.clone())); - - vec![Variant::VariantMap(map)] - }), - ); - - res.insert( - s!("UserModes"), - Variant::VariantList(vec![Variant::VariantMap( - self.user_modes - .iter() - .map(|(k, v)| (k.clone(), Variant::String(v.clone()))) - .collect(), - )]), - ); - res.insert( - s!("name"), - Variant::VariantList(vec![Variant::String(self.name.clone())]), - ); - res.insert( - s!("topic"), - Variant::VariantList(vec![Variant::String(self.topic.clone())]), - ); - res.insert( - s!("password"), - Variant::VariantList(vec![Variant::String(self.password.clone())]), - ); - res.insert( - s!("encrypted"), - Variant::VariantList(vec![Variant::bool(self.encrypted.clone())]), - ); - - res - } - fn from_network_map(input: &mut Self::Item) -> Self { - let mut chanmodes: VariantMap = match_variant!( - match_variant!(input.get_mut("ChanModes").unwrap(), Variant::VariantList).remove(0), - Variant::VariantMap - ); - - Self { - channel_modes_a: match_variant!(chanmodes.remove("A").unwrap(), Variant::VariantMap) - .into_iter() - .map(|(mut k, v)| (k.remove(0), match_variant!(v, Variant::StringList))) - .collect(), - channel_modes_b: match_variant!(chanmodes.remove("B").unwrap(), Variant::VariantMap) - .into_iter() - .map(|(mut k, v)| (k.remove(0), match_variant!(v, Variant::String))) - .collect(), - channel_modes_c: match_variant!(chanmodes.remove("C").unwrap(), Variant::VariantMap) - .into_iter() - .map(|(mut k, v)| (k.remove(0), match_variant!(v, Variant::String))) - .collect(), - channel_modes_d: match_variant!(chanmodes.remove("D").unwrap(), Variant::String), - user_modes: VariantMap::try_from( - match_variant!(input.get_mut("UserModes").unwrap(), Variant::VariantList).remove(0), - ) - .unwrap() - .into_iter() - .map(|(k, v)| (k, v.try_into().unwrap())) - .collect(), - name: match_variant!(input.get_mut("name").unwrap(), Variant::VariantList) - .remove(0) - .try_into() - .unwrap(), - topic: match_variant!(input.get_mut("topic").unwrap(), Variant::VariantList) - .remove(0) - .try_into() - .unwrap(), - password: match_variant!(input.get_mut("password").unwrap(), Variant::VariantList) - .remove(0) - .try_into() - .unwrap(), - encrypted: match_variant!(input.get_mut("encrypted").unwrap(), Variant::VariantList) - .remove(0) - .try_into() - .unwrap(), - } - } -} - #[cfg(test)] mod tests { use super::*; + use crate::primitive::{Variant, VariantMap}; + use crate::message::NetworkMap; + fn get_network() -> VariantMap { map! { - s!("encrypted") => Variant::VariantList( - vec![ + s!("encrypted") => Variant::bool( false, ), - ], - ), - s!("topic") => Variant::VariantList( - vec![ + s!("topic") => Variant::String( s!(""), ), - ], - ), - s!("password") => Variant::VariantList( - vec![ + s!("password") => Variant::String( s!(""), ), - ], - ), - s!("ChanModes") => Variant::VariantList( - vec![ - Variant::VariantMap(map! + s!("ChanModes") => Variant::VariantMap(map! { s!("B") => Variant::VariantMap(map! {}, @@ -470,10 +247,7 @@ mod tests { }), }, ), - ], - ), - s!("UserModes") => Variant::VariantList( - vec![ + s!("UserModes") => Variant::VariantMap(map! { s!("audron") => Variant::String( @@ -484,23 +258,20 @@ mod tests { ), }, ), - ], - ), - s!("name") => Variant::VariantList( - vec![ + s!("name") => Variant::String( s!("#audron-test"), ), - ], - ) } } fn get_runtime() -> IrcChannel { IrcChannel { - channel_modes_a: map! { 'b' => vec![s!("*!*@test"), s!("*!*@test2")] }, - channel_modes_b: map! {}, - channel_modes_c: map! { 'j' => s!("5:1"), 'x' => s!("10:5"), 'f' => s!("30:5"), 'F' => s!("5:60") }, - channel_modes_d: s!("tCnT"), + chan_modes: ChanModes { + channel_modes_a: map! { 'b' => vec![s!("*!*@test"), s!("*!*@test2")] }, + channel_modes_b: map! {}, + channel_modes_c: map! { 'j' => s!("5:1"), 'x' => s!("10:5"), 'f' => s!("30:5"), 'F' => s!("5:60") }, + channel_modes_d: s!("tCnT"), + }, user_modes: map! { s!("audron") => s!("o"), s!("audron_") => s!("") }, name: s!("#audron-test"), topic: s!(""), |
