forked from lavina/lavina
81 lines
2.8 KiB
Rust
81 lines
2.8 KiB
Rust
//! Handling of all client2server presence stanzas
|
||
|
||
use quick_xml::events::Event;
|
||
|
||
use lavina_core::prelude::*;
|
||
use lavina_core::room::RoomId;
|
||
use proto_xmpp::bind::{Jid, Name, Server};
|
||
use proto_xmpp::client::Presence;
|
||
use proto_xmpp::xml::{Ignore, ToXml};
|
||
|
||
use crate::XmppConnection;
|
||
|
||
impl<'a> XmppConnection<'a> {
|
||
pub async fn handle_presence(&mut self, output: &mut Vec<Event<'static>>, p: Presence<Ignore>) -> Result<()> {
|
||
match p.to {
|
||
None => {
|
||
self.self_presence(output, p.r#type.as_deref()).await;
|
||
}
|
||
Some(Jid {
|
||
name: Some(name),
|
||
server,
|
||
// resources in MUCs are members' personas – not implemented (yet?)
|
||
resource: Some(_),
|
||
}) if server.0 == self.hostname_rooms => {
|
||
self.muc_presence(name, output).await?;
|
||
}
|
||
_ => {
|
||
// TODO other presence cases
|
||
let response = Presence::<()>::default();
|
||
response.serialize(output);
|
||
}
|
||
}
|
||
Ok(())
|
||
}
|
||
|
||
async fn self_presence(&mut self, output: &mut Vec<Event<'static>>, r#type: Option<&str>) {
|
||
match r#type {
|
||
Some("unavailable") => {
|
||
// do not print anything
|
||
}
|
||
None => {
|
||
let response = Presence::<()> {
|
||
to: Some(Jid {
|
||
name: Some(self.user.xmpp_name.clone()),
|
||
server: Server(self.hostname.clone()),
|
||
resource: Some(self.user.xmpp_resource.clone()),
|
||
}),
|
||
from: Some(Jid {
|
||
name: Some(self.user.xmpp_name.clone()),
|
||
server: Server(self.hostname.clone()),
|
||
resource: Some(self.user.xmpp_resource.clone()),
|
||
}),
|
||
..Default::default()
|
||
};
|
||
response.serialize(output);
|
||
}
|
||
_ => todo!(),
|
||
}
|
||
}
|
||
|
||
async fn muc_presence(&mut self, name: Name, output: &mut Vec<Event<'static>>) -> Result<()> {
|
||
let a = self.user_handle.join_room(RoomId::from(name.0.clone())?).await?;
|
||
// TODO handle bans
|
||
let response = Presence::<()> {
|
||
to: Some(Jid {
|
||
name: Some(self.user.xmpp_name.clone()),
|
||
server: Server(self.hostname.clone()),
|
||
resource: Some(self.user.xmpp_resource.clone()),
|
||
}),
|
||
from: Some(Jid {
|
||
name: Some(name.clone()),
|
||
server: Server(self.hostname_rooms.clone()),
|
||
resource: Some(self.user.xmpp_muc_name.clone()),
|
||
}),
|
||
..Default::default()
|
||
};
|
||
response.serialize(output);
|
||
Ok(())
|
||
}
|
||
}
|