Make xmpp command enum to allow different commands Save subscription ask status. Don't ask if already requested subscription.
[?]
Jan 23, 2019, 11:20 AM
SYH7UQP6A62HRY2K6YR23X45TMFHJD7SW6J4T2MH4C3DJXKXVDZQCDependencies
- [2]
AA2ZWGRLEnter to MUC - [3]
5A5UVGNMMove receiver closing logic out of xmpp processing - [4]
PVCRPP3BSome servers don't send to in initial presence - [5]
5Y6YJ6UHAdd shutdown function to make actions before offline - [6]
BWDUANCVSecond part of processing result is only about stop_future - [7]
CBWCXUZZPrepare adding new items to roster - [8]
QWE26TMVupdate deps - [9]
IK3YDPTYUpdate deps - [10]
5OBTKGDLUpdate deps - [11]
5IKA4GO7Rename xmpp client field from "inner" to "client" - [12]
VS6AHRWIMove XMPP to separate dir - [13]
HU3NZX5ZProcess self-presence via new processing code - [14]
OB3HA2MDUse Client::new_with_jid to parse jid only once - [15]
V5HDBSZMUse jid for receiver address - [16]
UMTLHH77Process commands in the separate function - [17]
AYQZ2UIAUpdate deps - [18]
RGOSS73UConvert self-presence to xmpp_parser's type - [19]
XGP44R5HRework stopping xmpp connection - [20]
4LRBIGVTShow info about xmpp errors - [21]
3GEU7TC7Welcome to 2018! - [22]
OGMBXBKPMove online to XmppConnection - [23]
ACXUIS63Update dependecies - [24]
EOHEZXX3Move request processing to structure - [25]
QTCUURXNAdd additional requirement for command stream - [26]
QYY3KRGLUse failure instead Box<dyn Error> - [27]
HKSQO7JZEnable hyper http server and configuration - [28]
TDOR5XQUAccept destination - [29]
ALP2YJIURename XmppState to XmppProcessState - [30]
ZI4GJ72VAdd message to xmpp command - [31]
WBU7UOQWRead chatroom from config - [32]
OANBCLN5Move xmpp client into XmppState - [*]
FV6BJ5K6Send self-presence and store account info in Rc so it willbe used in some future in parallel - [*]
FVVPKFTLInitial commit
Change contents
- edit in src/xmpp/stanzas.rs at line 52
pub fn make_muc_presence(id: &str, from: xmpp_parsers::Jid, to: xmpp_parsers::Jid) -> Element {let mut presence = Presence::new(PresenceType::None);presence.from = Some(from);presence.to = Some(to);presence.id = Some(id.to_string());presence.add_payload(xmpp_parsers::muc::Muc::new());presence.into()} - replacement in src/xmpp/mod.rs at line 15
roster: HashMap<xmpp_parsers::Jid, (xmpp_parsers::roster::Subscription, Vec<String>)>,roster: HashMap<xmpp_parsers::Jid,(xmpp_parsers::roster::Subscription,xmpp_parsers::roster::Ask,Vec<String>,),>, - replacement in src/xmpp/mod.rs at line 101
let client =Client::new_with_jid(account.jid.clone(), &account.password);info!("xmpp initialized");let res_client = Client::new(&account.jid, &account.password);match res_client {Err(_e) => Box::new(future::ok(future::Loop::Continue(account)))as Box<dyn Future<Item = _, Error = _>>,Ok(client) => {info!("xmpp initialized"); - replacement in src/xmpp/mod.rs at line 108
let stop_future2 = stop_future.clone();let stop_future3 = stop_future.clone();let stop_future4 = stop_future.clone();let stop_future2 = stop_future.clone();let stop_future3 = stop_future.clone(); - replacement in src/xmpp/mod.rs at line 111
// future to wait for onlineBox::new(XmppConnection {state: XmppState {client,data: std::default::Default::default(),},account,// future to wait for onlineBox::new(XmppConnection {state: XmppState {client,data: std::default::Default::default(),},account,}.processing(XmppConnection::online, stop_future.clone()).map_err(|(acc, _)| acc).and_then(|(conn, r)| match r {Ok(Either::A(_)) => future::ok(conn),Ok(Either::B(_)) => future::err(conn.account),Err(_e) => future::err(conn.account),}).and_then(|conn| conn.initial_roster(stop_future2)).and_then(|conn| conn.self_presence(stop_future3)).then(|r| match r {Ok(conn) => future::ok(future::Loop::Break(conn)),Err(acc) => future::ok(future::Loop::Continue(acc)),},),) - replacement in src/xmpp/mod.rs at line 137
.processing(XmppConnection::online, stop_future.clone()).map_err(|(acc, _)| acc).and_then(|(conn, r)| match r {Ok(Either::A(_)) => future::ok(conn),Ok(Either::B(_)) => future::err(conn.account),Err(_e) => future::err(conn.account),}).and_then(|conn| conn.initial_roster(stop_future2)).and_then(|conn| conn.self_presence(stop_future3)).and_then(|conn| conn.enter_mucs(stop_future4)).then(|r| match r {Ok(conn) => future::ok(future::Loop::Break(conn)),Err(acc) => future::ok(future::Loop::Continue(acc)),}),)} - edit in src/xmpp/mod.rs at line 172
info!("Jid {} added to roster", jid); - replacement in src/xmpp/mod.rs at line 173
rdata.1.push(message);info!("Jid {} updated to roster", jid);rdata.2.push(message); - edit in src/xmpp/mod.rs at line 176
info!("Jid {} added in roster", jid); - replacement in src/xmpp/mod.rs at line 179
(xmpp_parsers::roster::Subscription::None, vec![message]),(xmpp_parsers::roster::Subscription::None,xmpp_parsers::roster::Ask::None,vec![message],), - replacement in src/xmpp/mod.rs at line 203
if !rdata.1.is_empty() {rdata.1 = i.ask;if !rdata.2.is_empty() { - replacement in src/xmpp/mod.rs at line 214
rdata.1.drain(..).map(|message| {rdata.2.drain(..).map(|message| { - replacement in src/xmpp/mod.rs at line 218
} else {} else if rdata.1 == xmpp_parsers::roster::Ask::None { - replacement in src/xmpp/mod.rs at line 231
.insert(i.jid, (i.subscription, vec![]));.insert(i.jid, (i.subscription, i.ask, vec![])); - replacement in src/xmpp/mod.rs at line 444
.insert(i.jid, (i.subscription, vec![]));.insert(i.jid, (i.subscription, i.ask, vec![])); - replacement in src/xmpp/mod.rs at line 575[3.21716]→[2.6147:6231](∅→∅),[2.6231]→[3.21800:21852](∅→∅),[3.2982]→[3.21800:21852](∅→∅),[3.21800]→[3.21800:21852](∅→∅),[3.21852]→[2.6232:6994](∅→∅),[2.6994]→[3.22614:22687](∅→∅),[3.22614]→[3.22614:22687](∅→∅)
if let Some(ref mut rdata) = self.state.data.roster.get_mut(&cmd.xmpp_to) {info!("Jid {} in roster", cmd.xmpp_to);let sub_to = match rdata.0 {xmpp_parsers::roster::Subscription::To => true,xmpp_parsers::roster::Subscription::Both => true,_ => false,};if sub_to {info!("Subscribed to {}", cmd.xmpp_to);self.state.data.send_queue.push_back(stanzas::make_chat_message(cmd.xmpp_to, cmd.message));} else {info!("Not subscribed to {}", cmd.xmpp_to);rdata.1.push(cmd.message);self.state.data.send_queue.push_back(stanzas::make_ask_subscribe(cmd.xmpp_to));}} else {info!("Jid {} not in roster", cmd.xmpp_to);match cmd {XmppCommand::Chat { xmpp_to, message } => {if let Some(ref mut rdata) = self.state.data.roster.get_mut(&xmpp_to) {info!("Jid {} in roster", xmpp_to);let sub_to = match rdata.0 {xmpp_parsers::roster::Subscription::To => true,xmpp_parsers::roster::Subscription::Both => true,_ => false,};if sub_to {info!("Subscribed to {}", xmpp_to);self.state.data.send_queue.push_back(stanzas::make_chat_message(xmpp_to, message));} else if rdata.1 == xmpp_parsers::roster::Ask::None {info!("Not subscribed to {}", xmpp_to);rdata.2.push(message);self.state.data.send_queue.push_back(stanzas::make_ask_subscribe(xmpp_to));}} else {info!("Jid {} not in roster", xmpp_to); - replacement in src/xmpp/mod.rs at line 601
self.state.data.counter += 1;let id_add_roster = format!("id_add_roster{}", self.state.data.counter);let add_roster = stanzas::make_add_roster(&id_add_roster, cmd.xmpp_to.clone());self.state.data.pending_add_roster_ids.insert(id_add_roster, (cmd.xmpp_to, cmd.message));info!("Adding jid to roster... {:?}", add_roster);self.state.data.counter += 1;let id_add_roster = format!("id_add_roster{}", self.state.data.counter);let add_roster = stanzas::make_add_roster(&id_add_roster, xmpp_to.clone());self.state.data.pending_add_roster_ids.insert(id_add_roster, (xmpp_to, message));info!("Adding jid to roster... {:?}", add_roster); - replacement in src/xmpp/mod.rs at line 610
self.state.data.send_queue.push_back(add_roster);self.state.data.send_queue.push_back(add_roster);}} - edit in src/xmpp/mod.rs at line 615[3.12136]→[3.2983:2984](∅→∅),[3.2984]→[2.6995:8397](∅→∅),[2.8397]→[3.3119:3125](∅→∅),[3.3119]→[3.3119:3125](∅→∅)
fn enter_mucs<F, E>(self,_stop_future: F,) -> impl Future<Item = Self, Error = std::rc::Rc<config::Account>>whereF: Future<Error = E> + 'static,E: Into<failure::Error> + 'static,{let XmppConnection { account, state } = self;let account2 = account.clone();let account3 = account.clone();stream::iter_ok(account.chatrooms.values().map(std::clone::Clone::clone).collect::<Vec<_>>(),).fold(state, move |XmppState { client, mut data }, muc_jid| {data.counter += 1;let id_muc_presence = format!("id_muc_presence{}", data.counter);let muc_presence =stanzas::make_muc_presence(&id_muc_presence, account2.jid.clone(), muc_jid);info!("Sending muc presence... {:?}", muc_presence);let account4 = account2.clone();use tokio::prelude::Sink;client.send(muc_presence).map_err(|e| {error!("Error on send muc presence: {}", e);account4}).and_then(|client| future::ok(XmppState { client, data }))}).map(|state| XmppConnection {account: account3,state,})} - replacement in src/xmpp/mod.rs at line 618
pub struct XmppCommand {pub xmpp_to: xmpp_parsers::Jid,pub message: String,pub enum XmppCommand {Chat {xmpp_to: xmpp_parsers::Jid,message: String,}, - replacement in src/main.rs at line 90
.send(XmppCommand { xmpp_to, message }).send(XmppCommand::Chat { xmpp_to, message }) - replacement in src/config.rs at line 6
#[serde(deserialize_with = "deserialize_jid")]pub jid: xmpp_parsers::Jid,pub jid: String, - edit in src/config.rs at line 25[3.1943]→[3.31464:31467](∅→∅),[3.31467]→[2.13774:13857](∅→∅),[3.780]→[3.31550:31619](∅→∅),[2.13857]→[3.31550:31619](∅→∅),[3.31550]→[3.31550:31619](∅→∅),[3.31619]→[2.13858:13976](∅→∅)
}fn deserialize_jid<'de, D>(deserializer: D) -> Result<xmpp_parsers::Jid, D::Error>whereD: serde::Deserializer<'de>,{use serde::Deserialize;let s = String::deserialize(deserializer)?;std::str::FromStr::from_str(&s).map_err(serde::de::Error::custom)