Add command to rejoin rooms

Signed-off-by: pep <pep@bouah.net>
This commit is contained in:
pep 2025-12-27 14:30:54 +01:00
commit ea62a41b78
2 changed files with 43 additions and 11 deletions

View file

@ -21,8 +21,9 @@ use tokio::{signal::ctrl_c, sync::mpsc};
use xmpp::jid::{BareJid, Jid, ResourcePart}; use xmpp::jid::{BareJid, Jid, ResourcePart};
use xmpp::parsers::message::MessageType; use xmpp::parsers::message::MessageType;
use xmpp::{ use xmpp::{
message::send::RawMessageSettings, muc::room::JoinRoomSettings, Agent, ClientBuilder, Agent, ClientBuilder, ClientFeature, ClientType, Config as AgentConfig, Event, RoomNick,
ClientFeature, ClientType, Event, RoomNick, Config as AgentConfig, message::send::RawMessageSettings,
muc::room::{JoinRoomSettings, LeaveRoomSettings},
}; };
pub struct XmppClient { pub struct XmppClient {
@ -30,6 +31,7 @@ pub struct XmppClient {
agent: Agent, agent: Agent,
rooms: Vec<BareJid>, rooms: Vec<BareJid>,
nickname: ResourcePart, nickname: ResourcePart,
admins: Vec<BareJid>,
} }
impl XmppClient { impl XmppClient {
@ -38,6 +40,7 @@ impl XmppClient {
password: &str, password: &str,
rooms: Vec<BareJid>, rooms: Vec<BareJid>,
nickname: ResourcePart, nickname: ResourcePart,
admins: Vec<BareJid>,
) -> XmppClient { ) -> XmppClient {
let config = AgentConfig { let config = AgentConfig {
bookmarks_autojoin: false, bookmarks_autojoin: false,
@ -56,6 +59,7 @@ impl XmppClient {
agent, agent,
rooms, rooms,
nickname, nickname,
admins,
} }
} }
@ -65,16 +69,19 @@ impl XmppClient {
Event::Online => { Event::Online => {
self.is_online = true; self.is_online = true;
debug!("XMPP Online"); debug!("XMPP Online");
self.join_rooms().await
}
Event::ChatMessage(_id, bare, message, _timeinfo) => {
if !self.admins.contains(&bare) {
debug!("Received chat message from {}, not in admins", bare);
continue;
}
for room in &self.rooms { debug!("Received chat message from {}: {}", bare, message);
self.agent
.join_room(JoinRoomSettings { if message == "rejoin" {
room: room.clone(), self.leave_rooms().await;
nick: Some(RoomNick::from_resource_ref(self.nickname.as_ref())), self.join_rooms().await
password: None,
status: Some(("en", "Hi there!")),
})
.await
} }
} }
Event::Disconnected(e) => { Event::Disconnected(e) => {
@ -88,6 +95,30 @@ impl XmppClient {
} }
} }
pub async fn join_rooms(&mut self) {
for room in &self.rooms {
self.agent
.join_room(JoinRoomSettings {
room: room.clone(),
nick: Some(RoomNick::from_resource_ref(self.nickname.as_ref())),
password: None,
status: Some(("en", "Hi there!")),
})
.await
}
}
pub async fn leave_rooms(&mut self) {
for room in &self.rooms {
self.agent
.leave_room(LeaveRoomSettings {
room: room.clone(),
status: Some(("en", "See you!")),
})
.await
}
}
pub async fn receive(&mut self, mut rx: mpsc::UnboundedReceiver<Hook>) { pub async fn receive(&mut self, mut rx: mpsc::UnboundedReceiver<Hook>) {
loop { loop {
tokio::select! { tokio::select! {

View file

@ -60,6 +60,7 @@ async fn main() -> Result<(), Error> {
config.password.as_str(), config.password.as_str(),
config.rooms, config.rooms,
config.nickname, config.nickname,
config.admins,
); );
let xmpp_handle = tokio::task::spawn(async move { let xmpp_handle = tokio::task::spawn(async move {