Describe response with count 0

This commit is contained in:
Mikhail 2024-05-04 16:33:53 +02:00
parent 45bd3f3819
commit 99a49feff9
2 changed files with 66 additions and 13 deletions

View File

@ -1,19 +1,20 @@
//! Handling of all client2server iq stanzas //! Handling of all client2server iq stanzas
use quick_xml::events::Event; use quick_xml::events::Event;
use serde::de::Unexpected::Option;
use lavina_core::room::{RoomId, RoomRegistry}; use lavina_core::room::{RoomId, RoomRegistry};
use proto_xmpp::bind::{BindResponse, Jid, Name, Server}; use proto_xmpp::bind::{BindResponse, Jid, Name, Server};
use proto_xmpp::client::{Iq, IqError, IqErrorType, IqType, Message, MessageType}; use proto_xmpp::client::{Iq, IqError, IqErrorType, IqType, Message, MessageType};
use proto_xmpp::disco::{Feature, Identity, InfoQuery, Item, ItemQuery}; use proto_xmpp::disco::{Feature, Identity, InfoQuery, Item, ItemQuery};
use proto_xmpp::mam::{Fin, Set};
use proto_xmpp::roster::RosterQuery; use proto_xmpp::roster::RosterQuery;
use proto_xmpp::session::Session; use proto_xmpp::session::Session;
use proto_xmpp::xml::ToXml;
use crate::proto::IqClientBody; use crate::proto::IqClientBody;
use crate::XmppConnection; use crate::XmppConnection;
use proto_xmpp::xml::{Ignore, ToXml};
impl<'a> XmppConnection<'a> { impl<'a> XmppConnection<'a> {
pub async fn handle_iq(&self, output: &mut Vec<Event<'static>>, iq: Iq<IqClientBody>) { pub async fn handle_iq(&self, output: &mut Vec<Event<'static>>, iq: Iq<IqClientBody>) {
match iq.body { match iq.body {
@ -88,14 +89,16 @@ impl<'a> XmppConnection<'a> {
req.serialize(output); req.serialize(output);
} }
IqClientBody::MessageArchiveRequest(request) => { IqClientBody::MessageArchiveRequest(request) => {
let response = self.mam().await; // let response = self.mam().await;
// let req = Iq { let response = Iq {
// from: iq.to, from: iq.to,
// id: iq.id, id: iq.id,
// to: None, to: None,
// r#type: IqType::Result, r#type: IqType::Result,
// body: response, body: Fin {
// }; set: Set { count: Some(0) },
},
};
response.serialize(output); response.serialize(output);
} }
_ => { _ => {

View File

@ -1,5 +1,5 @@
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use quick_xml::events::Event; use quick_xml::events::{BytesStart, Event};
use quick_xml::name::{Namespace, ResolveResult}; use quick_xml::name::{Namespace, ResolveResult};
use std::io::Read; use std::io::Read;
@ -7,6 +7,7 @@ use crate::xml::*;
pub const MAM_XMLNS: &'static str = "urn:xmpp:mam:2"; pub const MAM_XMLNS: &'static str = "urn:xmpp:mam:2";
pub const DATA_XMLNS: &'static str = "jabber:x:data"; pub const DATA_XMLNS: &'static str = "jabber:x:data";
pub const RESULT_SET_XMLNS: &'static str = "http://jabber.org/protocol/rsm";
#[derive(PartialEq, Eq, Debug, Clone)] #[derive(PartialEq, Eq, Debug, Clone)]
pub struct MessageArchiveRequest { pub struct MessageArchiveRequest {
@ -23,6 +24,55 @@ pub struct Field {
pub values: Vec<String>, pub values: Vec<String>,
} }
// Message archive response styled as a result set.
pub struct Fin {
pub set: Set,
}
pub struct Set {
pub count: Option<i32>,
}
impl FromXml for Set {
type P = impl Parser<Output = Result<Self>>;
fn parse() -> Self::P {
todo!()
}
}
impl FromXmlTag for Set {
const NAME: &'static str = "set";
const NS: &'static str = "http://jabber.org/protocol/rsm";
}
impl FromXml for Fin {
type P = impl Parser<Output = Result<Self>>;
fn parse() -> Self::P {
todo!()
}
}
impl FromXmlTag for Fin {
const NAME: &'static str = "fin";
const NS: &'static str = RESULT_SET_XMLNS;
}
impl ToXml for Fin {
fn serialize(&self, events: &mut Vec<Event<'static>>) {
events.push(Event::Start(format!(r#"fin xmlns="{}" complete=True"#, Fin::NS)));
events.push(Event::Start(format!(r#"set xmlns="{}""#, Set::NS)));
if let Some(count) = &self.set.count {
events.push(Event::Start("count".into()));
events.push(Event::Text("0".into()));
events.push(Event::End("count".into()));
}
events.push(Event::End("set".into()));
events.push(Event::End("fin".into()));
}
}
impl FromXmlTag for X { impl FromXmlTag for X {
const NAME: &'static str = "x"; const NAME: &'static str = "x";
const NS: &'static str = DATA_XMLNS; const NS: &'static str = DATA_XMLNS;
@ -140,7 +190,7 @@ mod tests {
#[test] #[test]
fn test_parse_archive_query() { fn test_parse_archive_query() {
let input = r#"<iq to='pubsub.shakespeare.lit' type='set' id='juliet1'><query xmlns='urn:xmpp:mam:2' queryid='f28'/></iq>"#; let input = r#"<iq to='pubsub.shakespeare.lit' type='set' id='juliet1'><query xmlns='urn:xmpp:mam:2' queryid='f28'/></iq>";
let result: Iq<MessageArchiveRequest> = parse(input).unwrap(); let result: Iq<MessageArchiveRequest> = parse(input).unwrap();
assert_eq!( assert_eq!(