aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--derive/src/network/maplist.rs32
-rw-r--r--derive/src/network/mod.rs35
-rw-r--r--src/message/signalproxy/objects/aliasmanager.rs4
-rw-r--r--src/message/signalproxy/objects/highlightrulemanager.rs24
-rw-r--r--src/message/signalproxy/objects/ignorelistmanager.rs4
-rw-r--r--src/message/signalproxy/objects/ircchannel.rs44
-rw-r--r--src/message/signalproxy/objects/mod.rs31
-rw-r--r--src/message/signalproxy/objects/network.rs87
-rw-r--r--src/session/mod.rs30
9 files changed, 137 insertions, 154 deletions
diff --git a/derive/src/network/maplist.rs b/derive/src/network/maplist.rs
index ebda601..8ce18c5 100644
--- a/derive/src/network/maplist.rs
+++ b/derive/src/network/maplist.rs
@@ -1,7 +1,7 @@
use proc_macro2::{Ident, TokenStream};
use quote::quote;
-use crate::network::{get_field_variant_type, gen_type};
+use crate::network::{gen_type, get_field_type};
use super::NetworkField;
@@ -16,7 +16,6 @@ pub(crate) fn to(fields: &Vec<NetworkField>) -> Vec<TokenStream> {
};
let field_name = field.ident.as_ref().unwrap();
- let field_type = get_field_variant_type(&field);
let field_inner = match field.network {
crate::network::NetworkRepr::List => quote! {
@@ -30,10 +29,10 @@ pub(crate) fn to(fields: &Vec<NetworkField>) -> Vec<TokenStream> {
},
};
- if let Some(_) = field.variant {
+ if field.stringlist {
quote! {
res.insert(#field_rename.to_string(),
- libquassel::primitive::Variant::#field_type(
+ libquassel::primitive::Variant::StringList(
std::vec::from_elem(#field_inner, 1)));
}
} else {
@@ -69,7 +68,7 @@ pub(crate) fn to_vec(_type_name: &Ident, fields: &Vec<NetworkField>) -> TokenStr
let field_type = match field.network {
crate::network::NetworkRepr::List => gen_type("VariantList"),
crate::network::NetworkRepr::Map => gen_type("VariantMap"),
- crate::network::NetworkRepr::None => get_field_variant_type(&field),
+ crate::network::NetworkRepr::None => get_field_type(&field),
};
let field_inner = match field.network {
@@ -86,7 +85,7 @@ pub(crate) fn to_vec(_type_name: &Ident, fields: &Vec<NetworkField>) -> TokenStr
// FIXME this section doesn't make any sense to me anymore
// why do we select a StringList if we have configured a variant???
- if let Some(_) = field.variant {
+ if field.stringlist {
lists.push(quote! {
let mut #field_name: libquassel::primitive::StringList = Vec::with_capacity(self.len());
});
@@ -148,8 +147,6 @@ pub(crate) fn from(fields: &Vec<NetworkField>) -> Vec<TokenStream> {
None => format!("{}", field.ident.as_ref().unwrap()).into(),
};
- let field_type = get_field_variant_type(&field);
-
let field_inner = match field.network {
super::NetworkRepr::List => quote! {
libquassel::message::NetworkList::from_network_list(&mut std::convert::TryInto::try_into(input.remove(0)).unwrap())
@@ -162,10 +159,10 @@ pub(crate) fn from(fields: &Vec<NetworkField>) -> Vec<TokenStream> {
},
};
- if let Some(_) = field.variant {
+ if field.stringlist {
quote! {
#field_name: match input.get_mut(#field_rename).unwrap() {
- libquassel::primitive::Variant::#field_type(input) => #field_inner,
+ libquassel::primitive::Variant::StringList(input) => #field_inner,
_ => panic!("#field_name: wrong variant")
},
}
@@ -190,17 +187,10 @@ pub(crate) fn from_vec(type_name: &Ident, fields: &Vec<NetworkField>) -> TokenSt
None => format!("{}", field.ident.as_ref().unwrap()).into(),
};
- let _field_name = field.ident.as_ref().unwrap();
-
- let _field_type = get_field_variant_type(field);
-
- let field_variant = match &field.variant {
- None => quote! {libquassel::primitive::VariantList},
- Some(variant_type) => match variant_type.as_str() {
- "StringList" => quote! {libquassel::primitive::StringList},
- "VariantMap" => quote! {libquassel::primitive::VariantMap},
- _ => quote! {libquassel::primitive::VariantMap},
- },
+ let field_variant = if field.stringlist {
+ quote! {libquassel::primitive::StringList}
+ } else {
+ quote! {libquassel::primitive::VariantList}
};
let inner = quote! {
diff --git a/derive/src/network/mod.rs b/derive/src/network/mod.rs
index aea8080..da8e718 100644
--- a/derive/src/network/mod.rs
+++ b/derive/src/network/mod.rs
@@ -61,6 +61,12 @@ pub struct NetworkField {
/// Skips this field when serializing to network representation
#[darling(default)]
skip: bool,
+
+ /// Special reprensentation case for NetworkMap maplist repr
+ /// in which case if the field is a String a StringList will be used instead of a VariantList
+ /// this cannot be switched with variant as that leads to collisions with the other network representations
+ #[darling(default)]
+ stringlist: bool,
}
fn parse_fields(input: &syn::DeriveInput) -> Vec<NetworkField> {
@@ -85,14 +91,11 @@ pub fn network_map(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let mut fields = parse_fields(&input);
let quassel_fields = super::QuasselField::parse(&input);
- fields
- .iter_mut()
- .zip(quassel_fields)
- .for_each(|(field, qfield)| {
- if field.rename.is_none() {
- field.rename = qfield.name
- }
- });
+ fields.iter_mut().zip(quassel_fields).for_each(|(field, qfield)| {
+ if field.rename.is_none() {
+ field.rename = qfield.name
+ }
+ });
let name = &input.ident;
@@ -171,14 +174,11 @@ pub fn network_list(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let mut fields = parse_fields(&input);
let quassel_fields = super::QuasselField::parse(&input);
- fields
- .iter_mut()
- .zip(quassel_fields)
- .for_each(|(field, qfield)| {
- if field.rename.is_none() {
- field.rename = qfield.name
- }
- });
+ fields.iter_mut().zip(quassel_fields).for_each(|(field, qfield)| {
+ if field.rename.is_none() {
+ field.rename = qfield.name
+ }
+ });
let name = &input.ident;
@@ -227,8 +227,7 @@ fn gen_type(typ: &str) -> syn::Type {
path: syn::Path {
leading_colon: None,
segments: {
- let mut res =
- syn::punctuated::Punctuated::<syn::PathSegment, syn::token::Colon2>::new();
+ let mut res = syn::punctuated::Punctuated::<syn::PathSegment, syn::token::Colon2>::new();
res.push(syn::PathSegment {
ident: syn::Ident::new(typ, proc_macro2::Span::call_site()),
diff --git a/src/message/signalproxy/objects/aliasmanager.rs b/src/message/signalproxy/objects/aliasmanager.rs
index 6d6b63c..d35f145 100644
--- a/src/message/signalproxy/objects/aliasmanager.rs
+++ b/src/message/signalproxy/objects/aliasmanager.rs
@@ -60,9 +60,9 @@ impl Syncable for AliasManager {
#[derive(Clone, Debug, std::cmp::PartialEq, NetworkMap)]
#[network(repr = "maplist")]
pub struct Alias {
- #[network(rename = "names", variant = "StringList")]
+ #[network(rename = "names", stringlist)]
pub name: String,
- #[network(rename = "expansions", variant = "StringList")]
+ #[network(rename = "expansions", stringlist)]
pub expansion: String,
}
diff --git a/src/message/signalproxy/objects/highlightrulemanager.rs b/src/message/signalproxy/objects/highlightrulemanager.rs
index 1a2b58f..8d2b4ee 100644
--- a/src/message/signalproxy/objects/highlightrulemanager.rs
+++ b/src/message/signalproxy/objects/highlightrulemanager.rs
@@ -23,11 +23,7 @@ pub struct HighlightRuleManager {
impl HighlightRuleManager {
/// Get a reference to a specific highlight rule by ID.
pub fn highlight_rule(&self, id: i32) -> Option<&HighlightRule> {
- if let Some(position) = self
- .highlight_rule_list
- .iter()
- .position(|rule| rule.id == id)
- {
+ if let Some(position) = self.highlight_rule_list.iter().position(|rule| rule.id == id) {
self.highlight_rule_list.get(position)
} else {
None
@@ -36,11 +32,7 @@ impl HighlightRuleManager {
/// Get a mutable reference to a specific highlight rule by ID.
pub fn highlight_rule_mut(&mut self, id: i32) -> Option<&mut HighlightRule> {
- if let Some(position) = self
- .highlight_rule_list
- .iter()
- .position(|rule| rule.id == id)
- {
+ if let Some(position) = self.highlight_rule_list.iter().position(|rule| rule.id == id) {
self.highlight_rule_list.get_mut(position)
} else {
None
@@ -90,11 +82,7 @@ impl HighlightRuleManager {
}
pub fn remove_highlight_rule(&mut self, id: i32) {
- if let Some(position) = self
- .highlight_rule_list
- .iter()
- .position(|rule| rule.id == id)
- {
+ if let Some(position) = self.highlight_rule_list.iter().position(|rule| rule.id == id) {
self.highlight_rule_list.remove(position);
}
@@ -205,7 +193,7 @@ impl Syncable for HighlightRuleManager {
#[network(repr = "maplist")]
pub struct HighlightRule {
pub id: i32,
- #[network(variant = "StringList")]
+ #[network(stringlist)]
pub name: String,
#[quassel(name = "isRegEx")]
pub is_regex: bool,
@@ -215,9 +203,9 @@ pub struct HighlightRule {
pub is_enabled: bool,
#[quassel(name = "isInverse")]
pub is_inverse: bool,
- #[network(variant = "StringList")]
+ #[network(stringlist)]
pub sender: String,
- #[network(variant = "StringList")]
+ #[network(stringlist)]
pub channel: String,
}
diff --git a/src/message/signalproxy/objects/ignorelistmanager.rs b/src/message/signalproxy/objects/ignorelistmanager.rs
index ce4ad43..ca287e8 100644
--- a/src/message/signalproxy/objects/ignorelistmanager.rs
+++ b/src/message/signalproxy/objects/ignorelistmanager.rs
@@ -184,7 +184,7 @@ impl Syncable for IgnoreListManager {
pub struct IgnoreListItem {
#[network(rename = "ignoreType", type = "i32")]
pub ignore_type: IgnoreType,
- #[network(rename = "ignoreRule", variant = "StringList")]
+ #[network(rename = "ignoreRule", stringlist)]
pub ignore_rule: String,
#[network(rename = "isRegEx")]
pub is_regex: bool,
@@ -192,7 +192,7 @@ pub struct IgnoreListItem {
pub strictness: StrictnessType,
#[network(rename = "scope", type = "i32")]
pub scope: ScopeType,
- #[network(rename = "scopeRule", variant = "StringList")]
+ #[network(rename = "scopeRule", stringlist)]
pub scope_rule: String,
#[network(rename = "isActive")]
pub is_active: bool,
diff --git a/src/message/signalproxy/objects/ircchannel.rs b/src/message/signalproxy/objects/ircchannel.rs
index 105f318..15ed5f3 100644
--- a/src/message/signalproxy/objects/ircchannel.rs
+++ b/src/message/signalproxy/objects/ircchannel.rs
@@ -2,7 +2,7 @@ use std::collections::HashMap;
#[cfg(feature = "server")]
use libquassel_derive::sync;
-use libquassel_derive::{NetworkMap, Setters};
+use libquassel_derive::{NetworkList, NetworkMap, Setters};
use log::{error, warn};
use crate::message::{Class, Syncable};
@@ -11,15 +11,15 @@ use crate::primitive::StringList;
use super::{ChanModes, ChannelModeType};
#[allow(dead_code)]
-#[derive(Debug, Clone, PartialEq, Setters, NetworkMap)]
+#[derive(Debug, Clone, PartialEq, Setters, NetworkList, NetworkMap)]
#[network(repr = "maplist")]
pub struct IrcChannel {
- #[network(rename = "ChanModes", network = "map")]
+ #[network(rename = "ChanModes", variant = "VariantMap", network = "map")]
pub chan_modes: ChanModes,
// pub channel_modes: HashMap<char, ChannelMode>,
#[setter(skip)]
- #[network(rename = "UserModes", network = "map")]
+ #[network(rename = "UserModes", variant = "VariantMap", network = "map")]
pub user_modes: HashMap<String, String>,
#[setter(skip)]
pub name: String,
@@ -180,6 +180,7 @@ impl crate::message::StatefulSyncableClient for IrcChannel {
where
Self: Sized,
{
+ unimplemented!()
}
}
@@ -190,6 +191,7 @@ impl crate::message::StatefulSyncableServer for IrcChannel {
where
Self: Sized,
{
+ unimplemented!()
}
}
@@ -201,24 +203,24 @@ impl Syncable for IrcChannel {
mod tests {
use super::*;
- use crate::primitive::{Variant, VariantMap};
use crate::message::NetworkMap;
+ use crate::primitive::{Variant, VariantMap};
fn get_network() -> VariantMap {
map! {
s!("encrypted") =>
- Variant::bool(
+ Variant::VariantList(vec![Variant::bool(
false,
- ),
+ )]),
s!("topic") =>
- Variant::String(
+ Variant::VariantList(vec![Variant::String(
s!(""),
- ),
+ )]),
s!("password") =>
- Variant::String(
+ Variant::VariantList(vec![Variant::String(
s!(""),
- ),
- s!("ChanModes") => Variant::VariantMap(map!
+ )]),
+ s!("ChanModes") => Variant::VariantList(vec![Variant::VariantMap(map!
{
s!("B") => Variant::VariantMap(map!
{},
@@ -246,9 +248,9 @@ mod tests {
s!("b") => Variant::StringList(vec![s!("*!*@test"), s!("*!*@test2")]),
}),
},
- ),
+ )]),
s!("UserModes") =>
- Variant::VariantMap(map!
+ Variant::VariantList(vec![Variant::VariantMap(map!
{
s!("audron") => Variant::String(
s!("o"),
@@ -257,11 +259,11 @@ mod tests {
s!(""),
),
},
- ),
+ )]),
s!("name") =>
- Variant::String(
+ Variant::VariantList(vec![Variant::String(
s!("#audron-test"),
- ),
+ )]),
}
}
fn get_runtime() -> IrcChannel {
@@ -287,10 +289,7 @@ mod tests {
#[test]
fn ircchannel_from_network() {
- assert_eq!(
- IrcChannel::from_network_map(&mut get_network()),
- get_runtime()
- )
+ assert_eq!(IrcChannel::from_network_map(&mut get_network()), get_runtime())
}
#[test]
@@ -304,8 +303,7 @@ mod tests {
base.add_user_mode(s!("audron"), s!("o"));
assert_eq!(res, base);
- res.user_modes =
- map! { s!("audron") => s!("oh"), s!("audron_") => s!(""), s!("test") => s!("h") };
+ res.user_modes = map! { s!("audron") => s!("oh"), s!("audron_") => s!(""), s!("test") => s!("h") };
base.add_user_mode(s!("test"), s!("h"));
assert_eq!(res, base);
}
diff --git a/src/message/signalproxy/objects/mod.rs b/src/message/signalproxy/objects/mod.rs
index de5bf35..b3b2858 100644
--- a/src/message/signalproxy/objects/mod.rs
+++ b/src/message/signalproxy/objects/mod.rs
@@ -1,31 +1,31 @@
mod aliasmanager;
-mod buffersyncer;
mod backlogmanager;
-mod bufferviewmanager;
+mod buffersyncer;
mod bufferviewconfig;
+mod bufferviewmanager;
mod certmanager;
+mod chanmodes;
mod coreinfo;
mod highlightrulemanager;
mod identity;
mod ignorelistmanager;
mod ircchannel;
-mod chanmodes;
mod ircuser;
mod network;
mod networkinfo;
pub use aliasmanager::*;
-pub use buffersyncer::*;
pub use backlogmanager::*;
-pub use bufferviewmanager::*;
+pub use buffersyncer::*;
pub use bufferviewconfig::*;
+pub use bufferviewmanager::*;
pub use certmanager::*;
+pub use chanmodes::*;
pub use coreinfo::*;
pub use highlightrulemanager::*;
pub use identity::*;
pub use ignorelistmanager::*;
pub use ircchannel::*;
-pub use chanmodes::*;
pub use ircuser::*;
pub use network::*;
pub use networkinfo::*;
@@ -70,7 +70,7 @@ pub enum Types {
Network(network::Network),
NetworkInfo(NetworkInfo),
NetworkConfig(NetworkConfig),
- // IrcChannel(IrcChannel),
+ IrcChannel(IrcChannel),
Unknown(VariantList),
}
@@ -90,16 +90,13 @@ impl Types {
Types::Network(val) => val.to_network_list(),
Types::NetworkInfo(val) => val.to_network_list(),
Types::NetworkConfig(val) => val.to_network_list(),
- // Types::IrcChannel(val) => todo!(),
+ Types::IrcChannel(val) => val.to_network_list(),
Types::Unknown(val) => val.clone(),
}
}
pub fn from_network(class_name: &str, object_name: &str, input: &mut VariantList) -> Self {
- debug!(
- "converting {} from network object: {:#?}",
- class_name, input
- );
+ debug!("converting {} from network object: {:#?}", class_name, input);
match class_name {
"AliasManager" => Types::AliasManager(AliasManager::from_network_list(input)),
"BufferSyncer" => Types::BufferSyncer(BufferSyncer::from_network_list(input)),
@@ -108,9 +105,7 @@ impl Types {
config.buffer_view_id = object_name.parse().unwrap();
Types::BufferViewConfig(config)
}
- "BufferViewManager" => {
- Types::BufferViewManager(BufferViewManager::from_network_list(input))
- }
+ "BufferViewManager" => Types::BufferViewManager(BufferViewManager::from_network_list(input)),
// "CoreInfo" => Types::CoreInfo(CoreInfo::from_network_map(
// &mut input.remove(0).try_into().unwrap(),
// )),
@@ -120,14 +115,12 @@ impl Types {
"HighlightRuleManager" => {
Types::HighlightRuleManager(HighlightRuleManager::from_network_list(input))
}
- "IgnoreListManager" => {
- Types::IgnoreListManager(IgnoreListManager::from_network_list(input))
- }
+ "IgnoreListManager" => Types::IgnoreListManager(IgnoreListManager::from_network_list(input)),
"CertManager" => Types::CertManager(CertManager::from_network_list(input)),
"Network" => Types::Network(Network::from_network_list(input)),
"NetworkInfo" => Types::NetworkInfo(NetworkInfo::from_network_list(input)),
"NetworkConfig" => Types::NetworkConfig(NetworkConfig::from_network_list(input)),
- // "IrcChannel" => Types::IrcChannel(IrcChannel::from_network_list(input)),
+ "IrcChannel" => Types::IrcChannel(IrcChannel::from_network_list(input)),
_ => Types::Unknown(input.to_owned()),
}
}
diff --git a/src/message/signalproxy/objects/network.rs b/src/message/signalproxy/objects/network.rs
index d944b17..33d2b33 100644
--- a/src/message/signalproxy/objects/network.rs
+++ b/src/message/signalproxy/objects/network.rs
@@ -42,10 +42,14 @@ impl Network {
fn determine_channel_mode_types(&mut self) {
let mut modes: Vec<&str> = self.supports.get("CHANMODES").unwrap().split(',').collect();
- self.channel_modes.insert(ChannelModeType::DChanmode, modes.pop().unwrap().to_owned());
- self.channel_modes.insert(ChannelModeType::CChanmode, modes.pop().unwrap().to_owned());
- self.channel_modes.insert(ChannelModeType::BChanmode, modes.pop().unwrap().to_owned());
- self.channel_modes.insert(ChannelModeType::AChanmode, modes.pop().unwrap().to_owned());
+ self.channel_modes
+ .insert(ChannelModeType::DChanmode, modes.pop().unwrap().to_owned());
+ self.channel_modes
+ .insert(ChannelModeType::CChanmode, modes.pop().unwrap().to_owned());
+ self.channel_modes
+ .insert(ChannelModeType::BChanmode, modes.pop().unwrap().to_owned());
+ self.channel_modes
+ .insert(ChannelModeType::AChanmode, modes.pop().unwrap().to_owned());
}
fn determine_prefixes(&mut self) {
@@ -63,13 +67,17 @@ impl Network {
self.prefixes = default_prefixes;
self.prefix_modes = default_prefix_modes;
}
- },
+ }
None => {
self.prefixes = default_prefixes;
self.prefix_modes = default_prefix_modes;
- },
+ }
}
}
+
+ pub fn add_channel(&mut self, name: &str, channel: IrcChannel) {
+ self.irc_channels.insert(name.to_owned(), channel);
+ }
}
impl crate::message::signalproxy::NetworkList for Network {
@@ -116,24 +124,18 @@ impl crate::message::signalproxy::NetworkList for Network {
map.insert(
s!("Users"),
- Variant::VariantMap(self.irc_users.iter().fold(
- HashMap::new(),
- |mut res, (_, v)| {
- res.extend(v.to_network_map());
-
- res
- },
- )),
- );
-
- let channels = self
- .irc_channels
- .iter()
- .fold(HashMap::new(), |mut res, (_, v)| {
+ Variant::VariantMap(self.irc_users.iter().fold(HashMap::new(), |mut res, (_, v)| {
res.extend(v.to_network_map());
res
- });
+ })),
+ );
+
+ let channels = self.irc_channels.iter().fold(HashMap::new(), |mut res, (_, v)| {
+ res.extend(v.to_network_map());
+
+ res
+ });
map.insert(s!("Channels"), Variant::VariantMap(channels));
@@ -200,10 +202,7 @@ impl crate::message::signalproxy::NetworkList for Network {
&mut users.try_into().expect("failed to convert Users"),
);
- users
- .into_iter()
- .map(|user| (user.nick.clone(), user))
- .collect()
+ users.into_iter().map(|user| (user.nick.clone(), user)).collect()
}
None => HashMap::new(),
}
@@ -227,9 +226,7 @@ impl crate::message::signalproxy::NetworkList for Network {
let var: VariantMap = i.next().unwrap().try_into().unwrap();
- var.into_iter()
- .map(|(k, v)| (k, v.try_into().unwrap()))
- .collect()
+ var.into_iter().map(|(k, v)| (k, v.try_into().unwrap())).collect()
},
caps: {
i.position(|x| *x == Variant::ByteArray(String::from("Caps")))
@@ -237,9 +234,7 @@ impl crate::message::signalproxy::NetworkList for Network {
let var: VariantMap = i.next().unwrap().try_into().unwrap();
- var.into_iter()
- .map(|(k, v)| (k, v.try_into().unwrap()))
- .collect()
+ var.into_iter().map(|(k, v)| (k, v.try_into().unwrap())).collect()
},
caps_enabled: {
i.position(|x| *x == Variant::ByteArray(String::from("CapsEnabled")))
@@ -380,21 +375,39 @@ mod tests {
fn network_determine_channel_modes() {
let mut network = Network::default();
- network.supports.insert(s!("CHANMODES"), s!("IXZbegw,k,FHJLWdfjlx,ABCDKMNOPQRSTcimnprstuz"));
+ network.supports.insert(
+ s!("CHANMODES"),
+ s!("IXZbegw,k,FHJLWdfjlx,ABCDKMNOPQRSTcimnprstuz"),
+ );
network.determine_channel_mode_types();
- assert_eq!(network.channel_modes.get(&ChannelModeType::AChanmode).unwrap(), "IXZbegw");
- assert_eq!(network.channel_modes.get(&ChannelModeType::BChanmode).unwrap(), "k");
- assert_eq!(network.channel_modes.get(&ChannelModeType::CChanmode).unwrap(), "FHJLWdfjlx");
- assert_eq!(network.channel_modes.get(&ChannelModeType::DChanmode).unwrap(), "ABCDKMNOPQRSTcimnprstuz");
+ assert_eq!(
+ network.channel_modes.get(&ChannelModeType::AChanmode).unwrap(),
+ "IXZbegw"
+ );
+ assert_eq!(
+ network.channel_modes.get(&ChannelModeType::BChanmode).unwrap(),
+ "k"
+ );
+ assert_eq!(
+ network.channel_modes.get(&ChannelModeType::CChanmode).unwrap(),
+ "FHJLWdfjlx"
+ );
+ assert_eq!(
+ network.channel_modes.get(&ChannelModeType::DChanmode).unwrap(),
+ "ABCDKMNOPQRSTcimnprstuz"
+ );
}
#[test]
fn network_get_channel_mode_type() {
let mut network = Network::default();
- network.supports.insert(s!("CHANMODES"), s!("IXZbegw,k,FHJLWdfjlx,ABCDKMNOPQRSTcimnprstuz"));
+ 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);
diff --git a/src/session/mod.rs b/src/session/mod.rs
index c2bfcd5..66dfdb7 100644
--- a/src/session/mod.rs
+++ b/src/session/mod.rs
@@ -81,20 +81,18 @@ pub trait SessionManager {
"addChannelMode" => {
let mut msg = msg.clone();
let mode: char = get_param!(msg);
- let mode_type: ChannelModeType =
- network.get_channel_mode_type(mode);
+ let mode_type: ChannelModeType = network.get_channel_mode_type(mode);
- network
- .irc_channels
- .get_mut(channel)
- .unwrap()
- .add_channel_mode(mode_type, mode, get_param!(msg));
+ network.irc_channels.get_mut(channel).unwrap().add_channel_mode(
+ mode_type,
+ mode,
+ get_param!(msg),
+ );
}
"removeChannelMode" => {
let mut msg = msg.clone();
let mode: char = get_param!(msg);
- let mode_type: ChannelModeType =
- network.get_channel_mode_type(mode);
+ let mode_type: ChannelModeType = network.get_channel_mode_type(mode);
network
.irc_channels
@@ -102,11 +100,7 @@ pub trait SessionManager {
.unwrap()
.remove_channel_mode(mode_type, mode, get_param!(msg));
}
- _ => network
- .irc_channels
- .get_mut(channel)
- .unwrap()
- .sync(msg.clone()),
+ _ => network.irc_channels.get_mut(channel).unwrap().sync(msg.clone()),
}
}
} else {
@@ -138,6 +132,14 @@ pub trait SessionManager {
}
Types::NetworkInfo(_) => (),
Types::NetworkConfig(_) => (),
+ Types::IrcChannel(channel) => {
+ let mut name = data.object_name.split("/");
+ let id: i32 = name.next().unwrap().parse().unwrap();
+ let name = name.next().unwrap();
+ if let Some(network) = self.network(id) {
+ network.add_channel(name, channel)
+ }
+ }
Types::Unknown(_) => (),
}
}