Add items to roster

[?]
Jan 1, 2019, 7:17 PM
SA2IOFGYAOWEAS2M3QUXAIUZ5PRGXLQLDYCF2JQKCBGN42K6XU6AC

Dependencies

  • [2] UAT5MV5O Directly use id for initial roster request
  • [3] UIXIQHDY Wait for commands via new processing code
  • [4] QTCUURXN Add additional requirement for command stream
  • [5] OANBCLN5 Move xmpp client into XmppState
  • [6] FWJDW3G5 Allow process xmpp incoming stanzas with futures
  • [7] AYQZ2UIA Update deps
  • [8] UMTLHH77 Process commands in the separate function
  • [9] SU4DNVCB Start to processing roster data
  • [10] 5IKA4GO7 Rename xmpp client field from "inner" to "client"
  • [11] EBETRYK7 Add counter for id. Check for jid in roster
  • [12] 3ADA5BBX Add items to roster from iq of "set" type
  • [13] BWDUANCV Second part of processing result is only about stop_future
  • [14] CBWCXUZZ Prepare adding new items to roster
  • [15] FV6BJ5K6 Send self-presence and store account info in Rc so it willbe used in some future in parallel
  • [16] ALP2YJIU Rename XmppState to XmppProcessState
  • [17] HCCX7VW6 Generate ids from counter
  • [18] PFC7OJQF Query roster
  • [19] V5HDBSZM Use jid for receiver address
  • [20] 3FYEOGCI Move additional rarely changed data to separate structure
  • [21] 4LRBIGVT Show info about xmpp errors
  • [*] VS6AHRWI Move XMPP to separate dir

Change contents

  • replacement in src/xmpp/stanzas.rs at line 4
    [3.141][2.0:34]()
    use xmpp_parsers::roster::Roster;
    [3.141]
    [3.141]
    use xmpp_parsers::roster::{Item, Roster};
  • edit in src/xmpp/stanzas.rs at line 17
    [3.156]
    [2.35]
    items: vec![],
  • edit in src/xmpp/stanzas.rs at line 19
    [2.54][3.43:66](),[3.156][3.43:66]()
    items: vec![],
  • edit in src/xmpp/stanzas.rs at line 22
    [3.270]
    [3.270]
    }
    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
    [3.484]
    [3.484]
    /// known roster data
  • edit in src/xmpp/mod.rs at line 16
    [3.519]
    [2.55]
    /// ids counter
  • edit in src/xmpp/mod.rs at line 18
    [2.75]
    [3.540]
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    /// map from id of adding item to roster and jid of item and message text
    pending_add_roster_ids: HashMap<String, (jid::Jid, String)>,
    ================================
    id_init_roster: Option<String>,
    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  • replacement in src/xmpp/mod.rs at line 148
    [3.783][3.1136:1150]()
    self,
    [3.783]
    [3.797]
    mut self,
  • replacement in src/xmpp/mod.rs at line 151
    [3.894][3.1151:1227]()
    info!("Incoming xmpp event: {:?}", event);
    future::ok(self)
    [3.894]
    [3.2124]
    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
    [3.4394][2.76:175]()
    fn process_initial_roster(&mut self, event: Event, id_init_roster: &str) -> Result<bool, ()> {
    [3.4394]
    [3.4471]
    fn process_initial_roster(&mut self, event: Event) -> Result<bool, ()> {
  • replacement in src/xmpp/mod.rs at line 303
    [3.4690][2.176:226]()
    if id == id_init_roster {
    [3.4690]
    [3.4739]
    if Some(id) == self.state.data.id_init_roster {
  • replacement in src/xmpp/mod.rs at line 314
    [3.5333][3.4186:4252]()
    info!("Got roster:");
    [3.5333]
    [3.5399]
    self.state.data.roster.clear();
    info!("Got first roster:");
  • replacement in src/xmpp/mod.rs at line 364
    [2.306][2.306:366]()
    let id_init_roster = format!("id{}", data.counter);
    [2.306]
    [2.366]
    let id_init_roster = format!("id_init_roster{}", data.counter);
  • edit in src/xmpp/mod.rs at line 366
    [2.434]
    [3.6971]
    data.id_init_roster = Some(id_init_roster);
  • replacement in src/xmpp/mod.rs at line 381
    [3.7416][2.435:607]()
    .processing(
    move |conn, event| conn.process_initial_roster(event, &id_init_roster),
    stop_future,
    )
    [3.7416]
    [3.6048]
    .processing(XmppConnection::process_initial_roster, stop_future)
  • replacement in src/xmpp/mod.rs at line 449
    [3.4591][3.4591:4618]()
    cmd: &XmppCommand,
    [3.4591]
    [3.4618]
    cmd: XmppCommand,
  • replacement in src/xmpp/mod.rs at line 452
    [3.4722][2.608:684]()
    if let Some(_jid_data) = self.state.data.roster.get(&cmd.xmpp_to) {
    [3.4722]
    [3.4786]
    if self.state.data.roster.get(&cmd.xmpp_to).is_some() {
  • edit in src/xmpp/mod.rs at line 454
    [3.4838]
    [3.4867]
    Box::new(future::ok(self)) as Box<dyn Future<Item = _, Error = _>>
  • edit in src/xmpp/mod.rs at line 457
    [3.4940]
    [3.5454]
    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
    [3.5464][2.685:710]()
    future::ok(self)
  • replacement in src/xmpp/mod.rs at line 543
    [3.6591][3.6591:6670]()
    Box::new(conn.process_command(&cmd).then(|r| {
    [3.6591]
    [3.6670]
    Box::new(conn.process_command(cmd).then(|r| {