List rooms command #77
|
@ -10,6 +10,7 @@ pub mod cthulhu;
|
||||||
pub mod management;
|
pub mod management;
|
||||||
pub mod misc;
|
pub mod misc;
|
||||||
pub mod parser;
|
pub mod parser;
|
||||||
|
pub mod rooms;
|
||||||
pub mod variables;
|
pub mod variables;
|
||||||
|
|
||||||
/// A custom error type specifically related to parsing command text.
|
/// A custom error type specifically related to parsing command text.
|
||||||
|
|
|
@ -9,6 +9,7 @@ use crate::commands::{
|
||||||
cthulhu::{CthAdvanceRoll, CthRoll},
|
cthulhu::{CthAdvanceRoll, CthRoll},
|
||||||
management::{CheckCommand, LinkCommand, RegisterCommand, UnlinkCommand, UnregisterCommand},
|
management::{CheckCommand, LinkCommand, RegisterCommand, UnlinkCommand, UnregisterCommand},
|
||||||
misc::HelpCommand,
|
misc::HelpCommand,
|
||||||
|
rooms::ListRoomsCommand,
|
||||||
variables::{
|
variables::{
|
||||||
DeleteVariableCommand, GetAllVariablesCommand, GetVariableCommand, SetVariableCommand,
|
DeleteVariableCommand, GetAllVariablesCommand, GetVariableCommand, SetVariableCommand,
|
||||||
},
|
},
|
||||||
|
@ -89,6 +90,7 @@ pub fn parse_command(input: &str) -> Result<Box<dyn Command>, BotError> {
|
||||||
"unlink" => convert_to!(UnlinkCommand, cmd_input),
|
"unlink" => convert_to!(UnlinkCommand, cmd_input),
|
||||||
"check" => convert_to!(CheckCommand, cmd_input),
|
"check" => convert_to!(CheckCommand, cmd_input),
|
||||||
"unregister" => convert_to!(UnregisterCommand, cmd_input),
|
"unregister" => convert_to!(UnregisterCommand, cmd_input),
|
||||||
|
"rooms" => convert_to!(ListRoomsCommand, cmd_input),
|
||||||
_ => Err(CommandParsingError::UnrecognizedCommand(cmd).into()),
|
_ => Err(CommandParsingError::UnrecognizedCommand(cmd).into()),
|
||||||
},
|
},
|
||||||
//All other errors passed up.
|
//All other errors passed up.
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
use super::{Command, Execution, ExecutionResult};
|
||||||
|
use crate::context::Context;
|
||||||
|
use crate::error::BotError;
|
||||||
|
use async_trait::async_trait;
|
||||||
|
use futures::stream::{self, StreamExt, TryStreamExt};
|
||||||
|
use matrix_sdk::identifiers::UserId;
|
||||||
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
|
pub struct ListRoomsCommand;
|
||||||
|
|
||||||
|
impl From<ListRoomsCommand> for Box<dyn Command> {
|
||||||
|
fn from(cmd: ListRoomsCommand) -> Self {
|
||||||
|
Box::new(cmd)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TryFrom<&str> for ListRoomsCommand {
|
||||||
|
type Error = BotError;
|
||||||
|
|
||||||
|
fn try_from(input: &str) -> Result<Self, Self::Error> {
|
||||||
|
Ok(ListRoomsCommand)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl Command for ListRoomsCommand {
|
||||||
|
fn name(&self) -> &'static str {
|
||||||
|
"list rooms command"
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_secure(&self) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn execute(&self, ctx: &Context<'_>) -> ExecutionResult {
|
||||||
|
let user_id = UserId::try_from(ctx.username)?;
|
||||||
|
let rooms_for_user = crate::matrix::get_rooms_for_user(ctx.matrix_client, &user_id).await?;
|
||||||
|
|
||||||
|
let rooms_for_user: Vec<String> = stream::iter(rooms_for_user)
|
||||||
|
.filter_map(|room| async move {
|
||||||
|
Some(
|
||||||
|
room.display_name()
|
||||||
|
.await
|
||||||
|
.map(|room_name| (room.room_id().to_string(), room_name)),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.map_ok(|(room_id, room_name)| format!("[{}] {}", room_id, room_name))
|
||||||
|
.try_collect()
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let html = format!("{}", rooms_for_user.join("\n"));
|
||||||
|
Execution::success(html)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue