Add command to rejoin rooms
Signed-off-by: pep <pep@bouah.net>
This commit is contained in:
parent
478780d063
commit
ea62a41b78
2 changed files with 43 additions and 11 deletions
53
src/bot.rs
53
src/bot.rs
|
|
@ -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! {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue