aboutsummaryrefslogtreecommitdiff
path: root/src/message/signalproxy/objects/identity.rs
blob: 6aa98302814c0b7d0fbc0e4e1545bf70c61075c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#[allow(unused_imports)]
use libquassel_derive::sync;
use libquassel_derive::{NetworkList, NetworkMap, Setters};

use crate::message::Class;
#[allow(unused_imports)]
use crate::message::StatefulSyncableClient;
#[allow(unused_imports)]
use crate::message::StatefulSyncableServer;

use crate::message::Syncable;

#[allow(unused_imports)]
use crate::message::signalproxy::translation::NetworkMap;
use crate::primitive::IdentityId;
use crate::primitive::VariantMap;
use crate::serialize::Deserialize;
use crate::serialize::Serialize;
use crate::serialize::UserType;

#[derive(Default, Debug, Clone, PartialEq, NetworkMap, NetworkList, Setters)]
pub struct Identity {
    #[network(rename = "identityId")]
    pub identity_id: IdentityId,
    #[network(rename = "identityName")]
    pub identity_name: String,
    #[network(rename = "realName")]
    pub real_name: String,
    #[network(rename = "nicks")]
    #[network(type = "StringList")]
    pub nicks: Vec<String>,

    /// Away Nick is not actually used
    /// in official network client
    #[network(rename = "awayNick")]
    pub away_nick: String,
    #[network(rename = "awayNickEnabled")]
    pub away_nick_enabled: bool,

    #[network(rename = "awayReason")]
    pub away_reason: String,
    #[network(rename = "awayReasonEnabled")]
    pub away_reason_enabled: bool,
    #[network(rename = "autoAwayEnabled")]
    pub auto_away_enabled: bool,
    #[network(rename = "autoAwayTime")]
    pub auto_away_time: i32,
    #[network(rename = "autoAwayReason")]
    pub auto_away_reason: String,
    #[network(rename = "autoAwayReasonEnabled")]
    pub auto_away_reason_enabled: bool,
    #[network(rename = "detachAwayEnabled")]
    pub detach_away_enabled: bool,
    #[network(rename = "detachAwayReason")]
    pub detach_away_reason: String,
    #[network(rename = "detachAwayReasonEnabled")]
    pub detach_away_reason_enabled: bool,
    #[network(rename = "ident")]
    pub ident: String,
    #[network(rename = "kickReason")]
    pub kick_reason: String,
    #[network(rename = "partReason")]
    pub part_reason: String,
    #[network(rename = "quitReason")]
    pub quit_reason: String,
}

impl UserType for Identity {
    const NAME: &str = "Identity";
}

impl Serialize for Identity {
    fn serialize(&self) -> Result<Vec<u8>, crate::ProtocolError> {
        self.to_network_map().serialize()
    }
}

impl Deserialize for Identity {
    fn parse(b: &[u8]) -> Result<(usize, Self), crate::ProtocolError>
    where
        Self: std::marker::Sized,
    {
        let (vlen, mut value) = VariantMap::parse(b)?;
        return Ok((vlen, Self::from_network_map(&mut value)));
    }
}

impl Identity {
    pub fn copy_from(&mut self, other: Identity) {
        #[cfg(feature = "server")]
        sync!("copyFrom", [other.to_network_map()]);

        *self = other;
    }
}

#[cfg(feature = "client")]
impl StatefulSyncableClient for Identity {
    fn sync_custom(&mut self, mut msg: crate::message::SyncMessage)
    where
        Self: Sized,
    {
        match msg.slot_name.as_str() {
            "copyFrom" => self.copy_from(Identity::from_network_map(&mut get_param!(msg))),
            "setAutoAwayEnabled" => self.set_auto_away_enabled(get_param!(msg)),
            "setAutoAwayReason" => self.set_auto_away_reason(get_param!(msg)),
            "setAutoAwayReasonEnabled" => self.set_auto_away_reason_enabled(get_param!(msg)),
            "setAutoAwayTime" => self.set_auto_away_time(get_param!(msg)),
            "setAwayNick" => self.set_away_nick(get_param!(msg)),
            "setAwayNickEnabled" => self.set_away_nick_enabled(get_param!(msg)),
            "setAwayReason" => self.set_away_reason(get_param!(msg)),
            "setAwayReasonEnabled" => self.set_away_reason_enabled(get_param!(msg)),
            "setDetachAwayEnabled" => self.set_detach_away_enabled(get_param!(msg)),
            "setDetachAwayReason" => self.set_detach_away_reason(get_param!(msg)),
            "setDetachAwayReasonEnabled" => self.set_detach_away_reason_enabled(get_param!(msg)),
            "setId" => self.set_identity_id(get_param!(msg)),
            "setIdent" => self.set_ident(get_param!(msg)),
            "setIdentityName" => self.set_identity_name(get_param!(msg)),
            "setKickReason" => self.set_kick_reason(get_param!(msg)),
            "setNicks" => self.set_nicks(get_param!(msg)),
            "setPartReason" => self.set_part_reason(get_param!(msg)),
            "setQuitReason" => self.set_quit_reason(get_param!(msg)),
            "setRealName" => self.set_real_name(get_param!(msg)),
            _ => (),
        }
    }
}

#[cfg(feature = "server")]
impl StatefulSyncableServer for Identity {}

impl Syncable for Identity {
    const CLASS: Class = Class::Identity;

    fn send_sync(&self, function: &str, params: crate::primitive::VariantList) {
        crate::message::signalproxy::SYNC_PROXY.get().unwrap().sync(
            Self::CLASS,
            Some(&self.identity_id.to_string()),
            function,
            params,
        );
    }
}