aboutsummaryrefslogtreecommitdiff
path: root/src/message/signalproxy/objects/network.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/message/signalproxy/objects/network.rs369
1 files changed, 369 insertions, 0 deletions
diff --git a/src/message/signalproxy/objects/network.rs b/src/message/signalproxy/objects/network.rs
new file mode 100644
index 0000000..cb1edd2
--- /dev/null
+++ b/src/message/signalproxy/objects/network.rs
@@ -0,0 +1,369 @@
+use crate::primitive::{StringList, Variant, VariantList, VariantMap};
+
+#[allow(unused_imports)]
+use libquassel_derive::Network;
+
+use std::collections::HashMap;
+
+use num_derive::{FromPrimitive, ToPrimitive};
+use num_traits::{FromPrimitive, ToPrimitive};
+
+use super::{ircchannel::IrcChannel, ircuser::IrcUser, networkinfo::NetworkInfo};
+
+#[derive(Debug, Clone)]
+pub struct Network {
+ my_nick: String,
+ latency: i32,
+ current_server: String,
+ is_connected: bool,
+ connection_state: ConnectionState,
+ // prefixes: Vec<char>,
+ // prefix_modes: Vec<char>,
+ // channel_modes: HashMap<ChannelModeType, Vec<char>>,
+ irc_users: HashMap<String, IrcUser>,
+ irc_channels: HashMap<String, IrcChannel>,
+ supports: HashMap<String, String>,
+ caps: HashMap<String, String>,
+ caps_enabled: Vec<String>,
+ network_info: NetworkInfo,
+}
+
+// impl crate::message::signalproxy::Network for Network {
+// type Item = VariantList;
+
+// fn to_network(&self) -> Self::Item {
+// let mut res = Self::Item::new();
+
+// res.push(Variant::ByteArray(s!("myNick")));
+// res.push(Variant::String(self.my_nick.clone()));
+// res.push(Variant::ByteArray(s!("latency")));
+// res.push(Variant::i32(self.latency));
+// res.push(Variant::ByteArray(s!("currentServer")));
+// res.push(Variant::String(self.current_server.clone()));
+// res.push(Variant::ByteArray(s!("isConnected")));
+// res.push(Variant::bool(self.is_connected));
+// res.push(Variant::ByteArray(s!("connectionState")));
+// res.push(Variant::i32(self.connection_state.clone() as i32));
+
+// res.push(Variant::ByteArray(s!("Supports")));
+// res.push(Variant::VariantMap(
+// self.supports
+// .iter()
+// .map(|(k, v)| (k.clone(), Variant::String(v.clone())))
+// .collect(),
+// ));
+
+// res.push(Variant::ByteArray(s!("Caps")));
+// res.push(Variant::VariantMap(
+// self.caps
+// .iter()
+// .map(|(k, v)| (k.clone(), Variant::String(v.clone())))
+// .collect(),
+// ));
+
+// res.push(Variant::ByteArray(s!("CapsEnabled")));
+// res.push(Variant::VariantList(
+// self.caps_enabled
+// .iter()
+// .map(|v| Variant::String(v.clone()))
+// .collect(),
+// ));
+
+// {
+// let mut map = VariantMap::new();
+
+// map.insert(
+// s!("Users"),
+// Variant::VariantMap(self.irc_users.iter().fold(
+// HashMap::new(),
+// |mut res, (_, v)| {
+// res.extend(v.to_network());
+
+// res
+// },
+// )),
+// );
+
+// let channels = self
+// .irc_channels
+// .iter()
+// .fold(HashMap::new(), |mut res, (_, v)| {
+// res.extend(v.to_network());
+
+// res
+// });
+
+// map.insert(s!("Channels"), Variant::VariantMap(channels));
+
+// res.push(Variant::ByteArray(s!("IrcUsersAndChannels")));
+// res.push(Variant::VariantMap(map));
+// }
+
+// res.extend(self.network_info.to_network());
+
+// res
+// }
+
+// fn from_network(input: Self::Item) -> Self {
+// let users_and_channels = match_variant!(
+// input
+// .iter()
+// .nth(
+// input
+// .iter()
+// .position(|x| *x == Variant::ByteArray(s!("IrcUsersAndChannels")))
+// .unwrap()
+// )
+// .unwrap(),
+// Variant::VariantMap
+// );
+
+// let res = Self {
+// my_nick: match_variant!(
+// input
+// .iter()
+// .nth(
+// input
+// .iter()
+// .position(|x| *x == Variant::ByteArray(s!("myNick")))
+// .unwrap()
+// )
+// .unwrap(),
+// Variant::String
+// ),
+// latency: match_variant!(
+// input
+// .iter()
+// .nth(
+// input
+// .iter()
+// .position(|x| *x == Variant::ByteArray(s!("latency")))
+// .unwrap()
+// )
+// .unwrap(),
+// Variant::i32
+// ),
+// current_server: match_variant!(
+// input
+// .iter()
+// .nth(
+// input
+// .iter()
+// .position(|x| *x == Variant::ByteArray(s!("currentServer")))
+// .unwrap()
+// )
+// .unwrap(),
+// Variant::String
+// ),
+// is_connected: match_variant!(
+// input
+// .iter()
+// .nth(
+// input
+// .iter()
+// .position(|x| *x == Variant::ByteArray(s!("isConnected")))
+// .unwrap()
+// )
+// .unwrap(),
+// Variant::bool
+// ),
+// connection_state: ConnectionState::from_i32(match_variant!(
+// input
+// .iter()
+// .nth(
+// input
+// .iter()
+// .position(|x| *x == Variant::ByteArray(s!("connectionState")))
+// .unwrap()
+// )
+// .unwrap(),
+// Variant::i32
+// ))
+// .unwrap(),
+// irc_users: match_variant!(
+// users_and_channels.get("Users").unwrap(),
+// Variant::VariantMap
+// )
+// .iter()
+// .map(|(k, v)| (k, IrcUser::from_network(v))),
+// irc_channels: match_variant!(
+// users_and_channels.get("Channels").unwrap(),
+// Variant::VariantMap
+// )
+// .iter()
+// .map(|(k, v)| (k, match_variant!(v, Variant::VariantList))),
+// supports: match_variant!(
+// input
+// .iter()
+// .nth(
+// input
+// .iter()
+// .position(|x| *x == Variant::ByteArray(s!("Supports")))
+// .unwrap()
+// )
+// .unwrap(),
+// Variant::VariantMap
+// )
+// .iter()
+// .map(|(k, v)| (k.clone(), match_variant!(v, Variant::String)))
+// .collect(),
+// caps: match_variant!(
+// input
+// .iter()
+// .nth(
+// input
+// .iter()
+// .position(|x| *x == Variant::ByteArray(s!("Caps")))
+// .unwrap()
+// )
+// .unwrap(),
+// Variant::VariantMap
+// )
+// .iter()
+// .map(|(k, v)| (k.clone(), match_variant!(v, Variant::String)))
+// .collect(),
+// caps_enabled: match_variant!(
+// input
+// .iter()
+// .nth(
+// input
+// .iter()
+// .position(|x| *x == Variant::ByteArray(s!("CapsEnabled")))
+// .unwrap()
+// )
+// .unwrap(),
+// Variant::VariantList
+// )
+// .iter()
+// .map(|v| match_variant!(v, Variant::String))
+// .collect(),
+// network_info: NetworkInfo::from_network(input),
+// };
+
+// todo!()
+// }
+// }
+
+#[allow(dead_code)]
+#[derive(Debug, Clone, PartialEq, Network)]
+#[network(repr = "map")]
+pub struct NetworkServer {
+ #[network(rename = "Host")]
+ pub host: String,
+ #[network(rename = "Port")]
+ pub port: u32,
+ #[network(rename = "Password")]
+ pub password: String,
+ #[network(rename = "UseSSL")]
+ pub use_ssl: bool,
+ #[network(rename = "sslVerify")]
+ pub ssl_verify: bool,
+ #[network(rename = "sslVersion")]
+ pub ssl_version: i32,
+ #[network(rename = "UseProxy")]
+ pub use_proxy: bool,
+ #[network(rename = "ProxyType")]
+ pub proxy_type: i32,
+ #[network(rename = "ProxyHost")]
+ pub proxy_host: String,
+ #[network(rename = "ProxyPort")]
+ pub proxy_port: u32,
+ #[network(rename = "ProxyUser")]
+ pub proxy_user: String,
+ #[network(rename = "ProxyPass")]
+ pub proxy_pass: String,
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::message::signalproxy::translation::Network;
+
+ fn networkserver_get_network() -> VariantMap {
+ map! {
+ s!("ProxyHost") => Variant::String(
+ s!("localhost"),
+ ),
+ s!("sslVerify") => Variant::bool(
+ true,
+ ),
+ s!("UseSSL") => Variant::bool(
+ true,
+ ),
+ s!("Port") => Variant::u32(
+ 6697,
+ ),
+ s!("Password") => Variant::String(
+ s!(""),
+ ),
+ s!("ProxyType") => Variant::i32(
+ 1,
+ ),
+ s!("sslVersion") => Variant::i32(
+ 0,
+ ),
+ s!("ProxyUser") => Variant::String(
+ s!(""),
+ ),
+ s!("ProxyPass") => Variant::String(
+ s!(""),
+ ),
+ s!("Host") => Variant::String(
+ s!("irc.snoonet.org"),
+ ),
+ s!("ProxyPort") => Variant::u32(
+ 8080,
+ ),
+ s!("UseProxy") => Variant::bool(
+ false,
+ ),
+ }
+ }
+ fn networkserver_get_runtime() -> NetworkServer {
+ NetworkServer {
+ host: s!("irc.snoonet.org"),
+ port: 6697,
+ password: s!(""),
+ use_ssl: true,
+ ssl_verify: true,
+ ssl_version: 0,
+ use_proxy: false,
+ proxy_type: 1,
+ proxy_host: s!("localhost"),
+ proxy_port: 8080,
+ proxy_user: s!(""),
+ proxy_pass: s!(""),
+ }
+ }
+
+ #[test]
+ fn network_server_to_network() {
+ assert_eq!(
+ networkserver_get_runtime().to_network(),
+ networkserver_get_network()
+ )
+ }
+}
+
+#[allow(dead_code)]
+#[derive(Debug, Clone, PartialEq, FromPrimitive, ToPrimitive)]
+#[repr(C)]
+enum ConnectionState {
+ Disconnected = 0x00,
+ Connecting = 0x01,
+ Initializing = 0x02,
+ Initialized = 0x03,
+ Reconnecting = 0x04,
+ Disconnecting = 0x05,
+}
+
+#[allow(dead_code)]
+#[derive(Debug, Clone, PartialEq, FromPrimitive, ToPrimitive)]
+#[repr(C)]
+enum ChannelModeType {
+ NotAChanmode = 0x00,
+ AChanmode = 0x01,
+ BChanmode = 0x02,
+ CChanmode = 0x04,
+ DChanmode = 0x08,
+}