aboutsummaryrefslogtreecommitdiff
path: root/src/message/signalproxy/objects/ircchannel.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/message/signalproxy/objects/ircchannel.rs')
-rw-r--r--src/message/signalproxy/objects/ircchannel.rs323
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!(""),