use tokio_xmpp::connect::ServerConnector;
use tokio_xmpp::{
jid::BareJid,
parsers::{
muc::Muc,
presence::{Presence, Type as PresenceType},
},
};
use crate::{Agent, RoomNick};
pub async fn join_room<C: ServerConnector>(
agent: &mut Agent<C>,
room: BareJid,
nick: Option<String>,
password: Option<String>,
lang: &str,
status: &str,
) {
let mut muc = Muc::new();
if let Some(password) = password {
muc = muc.with_password(password);
}
let nick = nick.unwrap_or_else(|| agent.default_nick.read().unwrap().clone());
let room_jid = room.with_resource_str(&nick).unwrap();
let mut presence = Presence::new(PresenceType::None).with_to(room_jid);
presence.add_payload(muc);
presence.set_status(String::from(lang), String::from(status));
let _ = agent.client.send_stanza(presence.into()).await;
}
pub async fn leave_room<C: ServerConnector>(
agent: &mut Agent<C>,
room_jid: BareJid,
nickname: RoomNick,
lang: impl Into<String>,
status: impl Into<String>,
) {
let mut presence = Presence::new(PresenceType::Unavailable).with_to(
room_jid
.with_resource_str(nickname.as_str())
.expect("Invalid room JID after adding resource part."),
);
presence.set_status(lang, status);
if let Err(e) = agent.client.send_stanza(presence.into()).await {
error!("Failed to send leave room presence: {}", e);
}
}