Add items to roster
[?]
Jan 1, 2019, 7:17 PM
SA2IOFGYAOWEAS2M3QUXAIUZ5PRGXLQLDYCF2JQKCBGN42K6XU6ACDependencies
- [2]
UAT5MV5ODirectly use id for initial roster request - [3]
UIXIQHDYWait for commands via new processing code - [4]
QTCUURXNAdd additional requirement for command stream - [5]
OANBCLN5Move xmpp client into XmppState - [6]
FWJDW3G5Allow process xmpp incoming stanzas with futures - [7]
AYQZ2UIAUpdate deps - [8]
UMTLHH77Process commands in the separate function - [9]
SU4DNVCBStart to processing roster data - [10]
5IKA4GO7Rename xmpp client field from "inner" to "client" - [11]
EBETRYK7Add counter for id. Check for jid in roster - [12]
3ADA5BBXAdd items to roster from iq of "set" type - [13]
BWDUANCVSecond part of processing result is only about stop_future - [14]
CBWCXUZZPrepare adding new items to roster - [15]
FV6BJ5K6Send self-presence and store account info in Rc so it willbe used in some future in parallel - [16]
ALP2YJIURename XmppState to XmppProcessState - [17]
HCCX7VW6Generate ids from counter - [18]
PFC7OJQFQuery roster - [19]
V5HDBSZMUse jid for receiver address - [20]
3FYEOGCIMove additional rarely changed data to separate structure - [21]
4LRBIGVTShow info about xmpp errors - [*]
VS6AHRWIMove XMPP to separate dir
Change contents
- replacement in src/xmpp/stanzas.rs at line 4
use xmpp_parsers::roster::Roster;use xmpp_parsers::roster::{Item, Roster}; - edit in src/xmpp/stanzas.rs at line 17
items: vec![], - edit in src/xmpp/stanzas.rs at line 19
items: vec![], - edit in src/xmpp/stanzas.rs at line 22
}pub fn make_add_roster(id: &str, jid: jid::Jid) -> Element {let mut add_roster = Iq::from_set(Roster {items: vec![Item {jid,name: None,subscription: xmpp_parsers::roster::Subscription::None,groups: vec![],}],ver: None,});add_roster.id = Some(id.to_string());add_roster.into() - edit in src/xmpp/mod.rs at line 14
/// known roster data - edit in src/xmpp/mod.rs at line 16
/// ids counter - edit in src/xmpp/mod.rs at line 18
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>/// map from id of adding item to roster and jid of item and message textpending_add_roster_ids: HashMap<String, (jid::Jid, String)>,================================id_init_roster: Option<String>,<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - replacement in src/xmpp/mod.rs at line 148
self,mut self, - replacement in src/xmpp/mod.rs at line 151
info!("Incoming xmpp event: {:?}", event);future::ok(self)match event {Event::Stanza(stanza) => {info!("Incoming xmpp event: {:?}", stanza);let stanza = stanza.clone();use try_from::TryInto;if let Some(iq) = stanza.try_into().ok() as Option<xmpp_parsers::iq::Iq> {if let Some(id) = iq.id {if let Some((_, (jid, _message))) =self.state.data.pending_add_roster_ids.remove_entry(&id){if let xmpp_parsers::iq::IqType::Result(None) = iq.payload {info!("Jid {} added to roster", jid);}}}if let xmpp_parsers::iq::IqType::Set(element) = iq.payload {if let Some(roster) =element.try_into().ok() as Option<xmpp_parsers::roster::Roster>{self.state.data.roster.extend(roster.items.into_iter().map(|i| {info!("Add {} to roster", i.jid);(i.jid, ())}));}}}future::ok(self)}Event::Online => future::ok(self),e => {warn!("Unexpected event {:?}", e);future::err(self.account)}} - replacement in src/xmpp/mod.rs at line 297
fn process_initial_roster(&mut self, event: Event, id_init_roster: &str) -> Result<bool, ()> {fn process_initial_roster(&mut self, event: Event) -> Result<bool, ()> { - replacement in src/xmpp/mod.rs at line 303
if id == id_init_roster {if Some(id) == self.state.data.id_init_roster { - replacement in src/xmpp/mod.rs at line 314
info!("Got roster:");self.state.data.roster.clear();info!("Got first roster:"); - replacement in src/xmpp/mod.rs at line 364
let id_init_roster = format!("id{}", data.counter);let id_init_roster = format!("id_init_roster{}", data.counter); - edit in src/xmpp/mod.rs at line 366
data.id_init_roster = Some(id_init_roster); - replacement in src/xmpp/mod.rs at line 381
.processing(move |conn, event| conn.process_initial_roster(event, &id_init_roster),stop_future,).processing(XmppConnection::process_initial_roster, stop_future) - replacement in src/xmpp/mod.rs at line 449
cmd: &XmppCommand,cmd: XmppCommand, - replacement in src/xmpp/mod.rs at line 452
if let Some(_jid_data) = self.state.data.roster.get(&cmd.xmpp_to) {if self.state.data.roster.get(&cmd.xmpp_to).is_some() { - edit in src/xmpp/mod.rs at line 454
Box::new(future::ok(self)) as Box<dyn Future<Item = _, Error = _>> - edit in src/xmpp/mod.rs at line 457
let XmppConnection {account,state: XmppState { client, mut data },} = self;data.counter += 1;let id_add_roster = format!("id_add_roster{}", data.counter);let add_roster = stanzas::make_add_roster(&id_add_roster, cmd.xmpp_to.clone());let account2 = account.clone();info!("Adding jid to roster... {:?}", add_roster);use tokio::prelude::Sink;Box::new(client.send(add_roster).map_err(|e| {error!("Error on send adding to roster: {}", e);account2}).and_then(move |client| {data.pending_add_roster_ids.insert(id_add_roster, (cmd.xmpp_to, cmd.message));future::ok(XmppConnection {account,state: XmppState { client, data },})}),) - edit in src/xmpp/mod.rs at line 486
future::ok(self) - replacement in src/xmpp/mod.rs at line 543
Box::new(conn.process_command(&cmd).then(|r| {Box::new(conn.process_command(cmd).then(|r| {