Add timezone command

This commit is contained in:
Xyon 2023-08-24 10:27:15 +01:00
parent 06064a8c9e
commit 8a02ee7666
Signed by: xyon
GPG Key ID: DD18155D6B18078D
5 changed files with 88 additions and 49 deletions

View File

@ -12,6 +12,7 @@ built = { version = "0.6.0", features = ["git2", "chrono"] }
[dependencies] [dependencies]
built = { version = "0.6.0", features = ["git2", "chrono"] } built = { version = "0.6.0", features = ["git2", "chrono"] }
chrono = "0.4.26" chrono = "0.4.26"
chrono-tz = "0.8.3"
clap = "4.3.4" clap = "4.3.4"
config = { version = "0.13.1", features = [ "yaml" ] } config = { version = "0.13.1", features = [ "yaml" ] }
d20 = "0.1.0" d20 = "0.1.0"

54
src/commands/admin.rs Normal file
View File

@ -0,0 +1,54 @@
use poise::serenity_prelude::Activity;
use crate::{ManifoldContext, ManifoldData, ManifoldResult};
use crate::error::ManifoldError;
#[poise::command(slash_command, prefix_command, owners_only)]
async fn dump_config(ctx: ManifoldContext<'_>) -> ManifoldResult<()> {
let config = &ctx.data().bot_config;
ctx.say(format!("Config dump; {:?}", config.config)).await?;
Ok(())
}
#[poise::command(slash_command, prefix_command, owners_only)]
async fn get_environment(ctx: ManifoldContext<'_>) -> ManifoldResult<()> {
let environment = ctx.data().bot_config.get_environment();
ctx.say(format!("Currently running under the {} environment", environment)).await?;
Ok(())
}
#[poise::command(slash_command, prefix_command, owners_only)]
async fn get_config(ctx: ManifoldContext<'_>, #[description="Config key"] key: String) -> ManifoldResult<()> {
let config = &ctx.data().bot_config;
let value = match config.get_value(&key) {
Ok(v) => v.clone(),
Err(_) => "not found, sorry!".to_string()
};
ctx.say(format!("Value for key {} was {}", &key, &value)).await?;
Ok(())
}
#[poise::command(slash_command, prefix_command, owners_only)]
async fn register_commands(ctx: ManifoldContext<'_>) -> ManifoldResult<()> {
poise::builtins::register_application_commands_buttons(ctx).await?;
Ok(())
}
#[poise::command(slash_command, prefix_command, track_edits, aliases("sa"), required_permissions = "MODERATE_MEMBERS")]
async fn set_activity(ctx: ManifoldContext<'_>, #[rest] #[description="Who to watch"] target: String) -> ManifoldResult<()> {
ctx.serenity_context().set_activity(Activity::watching(&target)).await;
ctx.say(format!("Okay, I'll start watching {}", target)).await?;
Ok(())
}
pub fn commands() -> [poise::Command<ManifoldData, ManifoldError>; 5] {
[dump_config(), get_environment(), get_config(), register_commands(), set_activity()]
}

View File

@ -1,8 +1,9 @@
use poise::serenity_prelude::*; use poise::serenity_prelude::*;
use crate::{ManifoldContext, ManifoldData}; use crate::{ManifoldContext, ManifoldData};
use crate::built_info; use chrono_tz::Tz;
use crate::error::{ManifoldError, ManifoldResult}; use crate::error::{ManifoldError, ManifoldResult};
use crate::models::user::UserInfo;
#[poise::command(prefix_command, track_edits, slash_command)] #[poise::command(prefix_command, track_edits, slash_command)]
async fn help( async fn help(
@ -34,21 +35,6 @@ async fn ping(ctx: ManifoldContext<'_>,) -> ManifoldResult<()> {
Ok(()) Ok(())
} }
#[poise::command(slash_command, prefix_command, owners_only)]
async fn register_commands(ctx: ManifoldContext<'_>) -> ManifoldResult<()> {
poise::builtins::register_application_commands_buttons(ctx).await?;
Ok(())
}
#[poise::command(slash_command, prefix_command, track_edits, aliases("sa"), required_permissions = "MODERATE_MEMBERS")]
async fn set_activity(ctx: ManifoldContext<'_>, #[rest] #[description="Who to watch"] target: String) -> ManifoldResult<()> {
ctx.serenity_context().set_activity(Activity::watching(&target)).await;
ctx.say(format!("Okay, I'll start watching {}", target)).await?;
Ok(())
}
#[poise::command(slash_command, prefix_command)] #[poise::command(slash_command, prefix_command)]
async fn version(ctx: ManifoldContext<'_>) -> ManifoldResult<()> { async fn version(ctx: ManifoldContext<'_>) -> ManifoldResult<()> {
let version_string = &ctx.data().version_string; let version_string = &ctx.data().version_string;
@ -60,38 +46,38 @@ async fn version(ctx: ManifoldContext<'_>) -> ManifoldResult<()> {
Ok(()) Ok(())
} }
#[poise::command(slash_command, prefix_command, owners_only)] #[poise::command(slash_command, prefix_command, aliases("st"))]
async fn get_config(ctx: ManifoldContext<'_>, #[description="Config key"] key: String) -> ManifoldResult<()> { async fn set_timezone(ctx: ManifoldContext<'_>, input_timezone: String) -> ManifoldResult<()> {
let config = &ctx.data().bot_config; let mut userinfo = ctx.data().user_info.lock().await;
let value = match config.get_value(&key) { let validated_timezone: Tz = match input_timezone.parse() {
Ok(v) => v.clone(), Ok(r) => r,
Err(_) => "not found, sorry!".to_string() Err(e) => {
error!("Problem parsing timezone input: {:?}", e);
ctx.send(|f| f.content(format!("Are you having a laugh? What kind of timezone is that? {:?}", e)).reply(true)).await?;
Err(e)?
}
}; };
ctx.say(format!("Value for key {} was {}", &key, &value)).await?; if let Some(user) = userinfo.get_mut(ctx.author().id.as_u64()) {
user.timezone = Some(validated_timezone.to_string());
ctx.send(|f| f.content(format!("I have set your timezone to {}, but we all know that UTC is the One True Timezone.", validated_timezone.to_string())).reply(true)).await?;
} else {
let new_user = UserInfo {
user_id: ctx.author().id.as_u64().to_owned() as i64,
username: ctx.author().name.to_owned(),
weather_location: None,
weather_units: None,
timezone: Some(validated_timezone.to_string()),
last_seen: Some(chrono::Utc::now().timestamp())
};
userinfo.insert(ctx.author().id.as_u64().clone(), new_user);
ctx.send(|f| f.content(format!("I have set your timezone to {}, but we all know that UTC is the One True Timezone.", validated_timezone.to_string())).reply(true)).await?;
}
Ok(()) Ok(())
} }
#[poise::command(slash_command, prefix_command, owners_only)] pub fn commands() -> [poise::Command<ManifoldData, ManifoldError>; 4] {
async fn dump_config(ctx: ManifoldContext<'_>) -> ManifoldResult<()> { [help(), ping(), version(), set_timezone()]
let config = &ctx.data().bot_config;
ctx.say(format!("Config dump; {:?}", config.config)).await?;
Ok(())
}
#[poise::command(slash_command, prefix_command, owners_only)]
async fn get_environment(ctx: ManifoldContext<'_>) -> ManifoldResult<()> {
let environment = ctx.data().bot_config.get_environment();
ctx.say(format!("Currently running under the {} environment", environment)).await?;
Ok(())
}
pub fn commands() -> [poise::Command<ManifoldData, ManifoldError>; 8] {
[help(), ping(), register_commands(), set_activity(), version(), get_config(), dump_config(), get_environment()]
} }

View File

@ -1,3 +1,4 @@
mod admin;
mod core; mod core;
mod weather; mod weather;
@ -5,6 +6,7 @@ use crate::ManifoldCommand;
pub fn collect_commands(injected: Vec<ManifoldCommand>) -> Vec<ManifoldCommand> { pub fn collect_commands(injected: Vec<ManifoldCommand>) -> Vec<ManifoldCommand> {
core::commands().into_iter() core::commands().into_iter()
.chain(admin::commands())
.chain(weather::commands()) .chain(weather::commands())
.chain(injected) .chain(injected)
.collect() .collect()

View File

@ -1,19 +1,15 @@
use std::sync::atomic::AtomicBool; use std::sync::atomic::AtomicBool;
use poise::{Event, FrameworkContext}; use poise::{Event, FrameworkContext};
use poise::futures_util::future::ok;
use poise::serenity_prelude::async_trait;
use poise::serenity_prelude::model::{ use poise::serenity_prelude::model::{
gateway::Ready, gateway::Ready,
id::ChannelId, id::ChannelId,
}; };
use poise::serenity_prelude::{Context, EventHandler, Message}; use poise::serenity_prelude::{Context, Message};
use crate::{ManifoldConfig, ManifoldContext, ManifoldData, ManifoldDataInner}; use crate::ManifoldData;
use crate::error::{ManifoldError, ManifoldResult}; use crate::error::{ManifoldError, ManifoldResult};
use crate::models::user::UserInfo; use crate::models::user::UserInfo;
use crate::responses::Responses;
pub struct Handler { pub struct Handler {
pub timer_running: AtomicBool, pub timer_running: AtomicBool,
} }