use tokio_xmpp::parsers::{
muc::user::{MucUser, Status},
presence::{Presence, Type as PresenceType},
};
use crate::{Agent, Event};
pub async fn handle_presence(agent: &mut Agent, presence: Presence) -> Vec<Event> {
let mut events = vec![];
let from = presence.from.clone().unwrap().to_bare();
if let Some(muc) = presence
.payloads
.iter()
.filter_map(|p| MucUser::try_from(p.clone()).ok())
.next()
{
if muc.status.iter().any(|s| *s == Status::SelfPresence) {
match presence.type_ {
PresenceType::None => {
if let Some(nick) = agent.rooms_joining.get(&from) {
agent.rooms_joined.insert(from.clone(), nick.clone());
agent.rooms_joining.remove(&from);
} else {
warn!(
"Received self-presence from {} while the room was not marked as joining.",
presence.from.unwrap()
);
}
events.push(Event::RoomJoined(from.clone()));
}
PresenceType::Unavailable => {
if agent.rooms_leaving.contains_key(&from) {
agent.rooms_joined.remove(&from);
agent.rooms_leaving.remove(&from);
} else {
warn!(
"Received self-presence unavailable from {} while the room was not marked as leaving.",
presence.from.unwrap()
);
}
events.push(Event::RoomLeft(from.clone()));
}
_ => debug!(
"Unhandled self-presence with type {:?} from {:?}",
presence.type_, from
),
}
}
}
events
}