Prepare adding new items to roster
[?]
Jan 1, 2019, 6:01 PM
CBWCXUZZBPQYFROVZFCIWHW3CPNAGXO3PUARLGOF4DUF6VVCYKVQCDependencies
- [2]
3ADA5BBXAdd items to roster from iq of "set" type - [3]
NDDQQP2PUpdate deps - [4]
HU3NZX5ZProcess self-presence via new processing code - [5]
ZI4GJ72VAdd message to xmpp command - [6]
FV6BJ5K6Send self-presence and store account info in Rc so it willbe used in some future in parallel - [7]
QYY3KRGLUse failure instead Box<dyn Error> - [8]
QWE26TMVupdate deps - [9]
PBRUH4BJRename optional XmppConnection to MaybeXmppConnection - [10]
UMTLHH77Process commands in the separate function - [11]
HCCX7VW6Generate ids from counter - [12]
FWJDW3G5Allow process xmpp incoming stanzas with futures - [13]
AGIW6YR3Use shared future for signal everywhere - [14]
EBETRYK7Add counter for id. Check for jid in roster - [15]
OGMBXBKPMove online to XmppConnection - [16]
L77O4T7MFormatting and fixes - [17]
X6L47BHQUse different structure for established xmpp connection - [18]
BTOZT4JPUse failure - [19]
ALP2YJIURename XmppState to XmppProcessState - [20]
VS6AHRWIMove XMPP to separate dir - [21]
4LRBIGVTShow info about xmpp errors - [22]
SU4DNVCBStart to processing roster data - [23]
EOHEZXX3Move request processing to structure - [24]
TDOR5XQUAccept destination - [25]
PFC7OJQFQuery roster - [26]
3FYEOGCIMove additional rarely changed data to separate structure - [27]
5A5UVGNMMove receiver closing logic out of xmpp processing - [28]
CP4MZO6VLeftover commands are processed via stoppable receiver - [29]
5IKA4GO7Rename xmpp client field from "inner" to "client" - [30]
V5HDBSZMUse jid for receiver address - [31]
5OBTKGDLUpdate deps - [32]
XGP44R5HRework stopping xmpp connection - [33]
PVCRPP3BSome servers don't send to in initial presence - [34]
OANBCLN5Move xmpp client into XmppState - [35]
QTCUURXNAdd additional requirement for command stream - [36]
UIXIQHDYWait for commands via new processing code - [37]
AYQZ2UIAUpdate deps - [38]
BWDUANCVSecond part of processing result is only about stop_future - [39]
IK3YDPTYUpdate deps
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 13
#[derive(Default)]struct XmppData {roster: HashMap<jid::Jid, ()>,_counter: usize,} - replacement in src/xmpp/mod.rs at line 22
roster: HashMap<jid::Jid, ()>,data: XmppData, - replacement in src/xmpp/mod.rs at line 44
impl MaybeXmppConnection {fn new(account: config::Account) -> MaybeXmppConnection {impl From<config::Account> for MaybeXmppConnection {fn from(from: config::Account) -> MaybeXmppConnection { - replacement in src/xmpp/mod.rs at line 47
account: std::rc::Rc::new(account),account: std::rc::Rc::new(from),state: None,}}}impl From<std::rc::Rc<config::Account>> for MaybeXmppConnection {fn from(from: std::rc::Rc<config::Account>) -> MaybeXmppConnection {MaybeXmppConnection {account: from, - edit in src/xmpp/mod.rs at line 60
} - edit in src/xmpp/mod.rs at line 62
impl MaybeXmppConnection { - replacement in src/xmpp/mod.rs at line 64
/// don't connect if stop_future resolved/// don't connect only if stop_future resolved - replacement in src/xmpp/mod.rs at line 101
roster: HashMap::new(),data: std::default::Default::default(), - replacement in src/xmpp/mod.rs at line 142
mut self,self, - replacement in src/xmpp/mod.rs at line 145
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 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| (i.jid, ())));}}}future::ok(self)}Event::Online => future::ok(self),e => {warn!("Unexpected event {:?}", e);future::err(self.account)}}info!("Incoming xmpp event: {:?}", event);future::ok(self) - replacement in src/xmpp/mod.rs at line 172
state: XmppState { client, roster },state: XmppState { client, data }, - replacement in src/xmpp/mod.rs at line 175
client.into_future().select2(stop_future).then(|r| match r {Ok(Either::A(((event, client), b))) => {if let Some(event) = event {let xmpp = XmppConnection {state: XmppState { client, roster },account,};Box::new(xmpp.xmpp_processing(&event).then(|r| match r {Ok(mut xmpp) => match stop_condition(&mut xmpp, event) {Ok(true) => {future::ok(future::Loop::Break((xmpp, Ok(Either::A(b)))))}Ok(false) => future::ok(future::Loop::Continue((xmpp,b,stop_condition,))),Err(_e) => future::err((xmpp.account, Ok(Either::A(b)))),client.into_future().select2(stop_future).then(move |r| match r {Ok(Either::A(((event, client), b))) => {if let Some(event) = event {let xmpp = XmppConnection {state: XmppState { client, data },account,};Box::new(xmpp.xmpp_processing(&event).then(|r| match r {Ok(mut xmpp) => match stop_condition(&mut xmpp, event) {Ok(true) => future::ok(future::Loop::Break((xmpp,Ok(Either::A(b)),))),Ok(false) => future::ok(future::Loop::Continue((xmpp,b,stop_condition,))),Err(_e) => future::err((xmpp.account, Ok(Either::A(b)))),},Err(account) => future::err((account, Ok(Either::A(b)))),}))as Box<dyn Future<Item = _, Error = _>>} else {Box::new(future::err((account, Ok(Either::A(b)))))}}Ok(Either::B((t, a))) => Box::new(if let Some(client) = a.into_inner() {future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account, - replacement in src/xmpp/mod.rs at line 211
Err(account) => future::err((account, Ok(Either::A(b)))),})) as Box<dyn Future<Item = _, Error = _>>Ok(Either::B(t)),))) - edit in src/xmpp/mod.rs at line 214
future::err((account, Ok(Either::B(t))))}),Err(Either::A((e, b))) => {warn!("XMPP error: {}", e.0); - replacement in src/xmpp/mod.rs at line 220
}Ok(Either::B((t, a))) => Box::new(if let Some(client) = a.into_inner() {future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, roster },account,},Ok(Either::B(t)),)))} else {future::err((account, Ok(Either::B(t))))}),Err(Either::A((e, b))) => {warn!("XMPP error: {}", e.0);Box::new(future::err((account, Ok(Either::A(b)))))}Err(Either::B((e, a))) => Box::new(if let Some(client) = a.into_inner() {future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, roster },account,},Err(e),)))} else {future::err((account, Err(e)))}),})Err(Either::B((e, a))) => Box::new(if let Some(client) = a.into_inner() {future::ok(future::Loop::Break((XmppConnection {state: XmppState { client, data },account,},Err(e),)))} else {future::err((account, Err(e)))}),}) - replacement in src/xmpp/mod.rs at line 272
self.state.data.roster.clear();info!("Got first roster:");info!("Got roster:"); - edit in src/xmpp/mod.rs at line 275
self.state.data.roster.insert(i.jid, ()); - replacement in src/xmpp/mod.rs at line 316
state: XmppState { client, roster },state: XmppState { client, data }, - replacement in src/xmpp/mod.rs at line 332
state: XmppState { client, roster },state: XmppState { client, data }, - replacement in src/xmpp/mod.rs at line 355
state: XmppState { client, roster },state: XmppState { client, data }, - replacement in src/xmpp/mod.rs at line 371
state: XmppState { client, roster },state: XmppState { client, data }, - edit in src/xmpp/mod.rs at line 400
fn process_command(self,cmd: &XmppCommand,) -> impl Future<Item = Self, Error = std::rc::Rc<config::Account>> {info!("Got command");if self.state.data.roster.get(&cmd.xmpp_to).is_some() {info!("Jid {} in roster", cmd.xmpp_to);future::ok(self)} else {info!("Jid {} not in roster", cmd.xmpp_to);let XmppConnection {account,state: XmppState { client, mut data },} = self;data.counter += 1;let id_add_roster = format!("id{}", data.counter);let add_roster = stanzas::make_add_roster(&id_add_roster, cmd.xmpp_to.clone());info!("Add jid to roster... {:?}", add_roster);future::ok(XmppConnection {account,state: XmppState { client, data },})}} - replacement in src/xmpp/mod.rs at line 432
struct XmppState<F, S> {struct XmppProcessState<F, S> { - replacement in src/xmpp/mod.rs at line 438
impl<F, S> XmppState<F, S> {fn new(cmd_recv: S, signal: F, conn: MaybeXmppConnection) -> XmppState<F, S> {XmppState {impl<F, S> XmppProcessState<F, S> {fn new(cmd_recv: S, signal: F, conn: MaybeXmppConnection) -> XmppProcessState<F, S> {XmppProcessState { - replacement in src/xmpp/mod.rs at line 458
let conn = MaybeXmppConnection::new(account);let conn = account.into(); - replacement in src/xmpp/mod.rs at line 460
future::loop_fn(XmppState::new(cmd_recv, signal, conn), |s| {let XmppState {future::loop_fn(XmppProcessState::new(cmd_recv, signal, conn), |s| {let XmppProcessState { - replacement in src/xmpp/mod.rs at line 466
conn.connect(signal.clone()).and_then(|conn| {info!("xmpp connected!");cmd_recv.into_future().map_err(|_| {error!("Got error on recv cmd");format_err!("Receive cmd error")}).map(|(cmd, cmd_recv)| (cmd, cmd_recv, conn))}).then(|r| {match r {Ok((cmd, cmd_recv, conn)) => {if let Some(_cmd) = cmd {info!("Got cmd");// got cmd, continuefuture::ok(future::Loop::Continue(XmppState::new(conn.connect(signal.clone()).and_then(|conn| {info!("xmpp connected!");conn.processing(|_, _| Ok(false), cmd_recv.into_future()).then(|r| match r {Ok((conn, r)) => match r {Ok(Either::A(f)) => Box::new(if let Some(cmd_recv) = f.into_inner() {future::ok(future::Loop::Continue(XmppProcessState { - replacement in src/xmpp/mod.rs at line 475
conn.into(),)))conn: conn.into(),})) - replacement in src/xmpp/mod.rs at line 478
future::ok(future::Loop::Break((None, conn.into())))future::err(format_err!("Command receiver is gone"))})as Box<dyn Future<Item = _, Error = _>>,Ok(Either::B((cmd, cmd_recv))) => {if let Some(cmd) = cmd {Box::new(conn.process_command(&cmd).then(|r| {future::ok(future::Loop::Continue(XmppProcessState {cmd_recv,signal,conn: match r {Ok(conn) => conn.into(),Err(account) => account.into(),},}))}))as Box<dyn Future<Item = _, Error = _>>} else {Box::new(future::ok(future::Loop::Break(())))} - replacement in src/xmpp/mod.rs at line 498
}Err(e) => {// got cmd error, its baderror!("Cmd error: {}", e);future::err(e)}}})}).and_then(|(opt_cmd_recv, _conn): (Option<S>, MaybeXmppConnection)| {if let Some(cmd_recv) = opt_cmd_recv {// process left commandsinfo!("Stop accepting commands");Box::new(cmd_recv.for_each(|_cmd| future::ok(())).map_err(|_| format_err!("cmd receiver last error")),) as Box<Future<Item = (), Error = failure::Error>>} else {Box::new(future::ok(()))}Err(_) => Box::new(future::err(format_err!("Command receiver is broken"))),},Err((account, r)) => Box::new(match r {Ok(Either::A(f)) => {if let Some(cmd_recv) = f.into_inner() {future::ok(future::Loop::Continue(XmppProcessState {cmd_recv,signal,conn: account.into(),}))} else {future::err(format_err!("Command receiver is gone"))}}Ok(Either::B((cmd, cmd_recv))) => {if let Some(_cmd) = cmd {error!("Xmpp connection broken while get command");future::ok(future::Loop::Continue(XmppProcessState {cmd_recv,signal,conn: account.into(),}))} else {future::ok(future::Loop::Break(()))}}Err(_) => future::err(format_err!("Command receiver is broken")),}),})})