meridian command for switching from 12/24 format
This commit is contained in:
parent
2bcaf0718f
commit
6311099cc6
@ -28,7 +28,8 @@
|
||||
- General changes:
|
||||
+ More command outputs use embeds to look nicer
|
||||
+ Commands that fail provide help outputs that are the same as the help command
|
||||
+ Remind commands now provide output that is more detailed. This includes showing the exact errors that occurred for each reminder that couldn't be set, if bulk-setting reminders
|
||||
+ Remind commands now provide output that is more detailed
|
||||
+ Translations are now loaded from a JSON file included within the executable
|
||||
+ Reduced user caching by individually querying some attributes like language and timezone
|
||||
+ Roles can now be silently mentioned with <<Role name>>
|
||||
+ The number of days will show even if zero to improve clarity
|
||||
|
@ -50,9 +50,11 @@ CREATE TABLE reminders.users (
|
||||
|
||||
language VARCHAR(2) DEFAULT 'EN' NOT NULL,
|
||||
timezone VARCHAR(32) DEFAULT 'UTC' NOT NULL,
|
||||
meridian_time BOOLEAN DEFAULT 0 NOT NULL,
|
||||
|
||||
allowed_dm BOOLEAN DEFAULT 1 NOT NULL,
|
||||
|
||||
patreon BOOL NOT NULL DEFAULT 0,
|
||||
patreon BOOLEAN NOT NULL DEFAULT 0,
|
||||
|
||||
PRIMARY KEY (id),
|
||||
FOREIGN KEY (dm_channel) REFERENCES reminders.channels(id) ON DELETE RESTRICT
|
||||
|
@ -239,7 +239,7 @@ async fn dashboard(ctx: &Context, msg: &Message, _args: String) {
|
||||
}
|
||||
|
||||
#[command]
|
||||
async fn clock(ctx: &Context, msg: &Message, args: String) {
|
||||
async fn clock(ctx: &Context, msg: &Message, _args: String) {
|
||||
let data = ctx.data.read().await;
|
||||
|
||||
let pool = data
|
||||
@ -251,26 +251,17 @@ async fn clock(ctx: &Context, msg: &Message, args: String) {
|
||||
|
||||
let language = UserData::language_of(&msg.author, &pool).await;
|
||||
let timezone = UserData::timezone_of(&msg.author, &pool).await;
|
||||
let meridian = UserData::meridian_of(&msg.author, &pool).await;
|
||||
|
||||
let now = Utc::now().with_timezone(&timezone);
|
||||
|
||||
let clock_display = lm.get(&language, "clock/time");
|
||||
|
||||
if args == "12" {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(
|
||||
&ctx,
|
||||
clock_display.replacen("{}", &now.format("%I:%M:%S %p").to_string(), 1),
|
||||
)
|
||||
.await;
|
||||
} else {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(
|
||||
&ctx,
|
||||
clock_display.replacen("{}", &now.format("%H:%M:%S").to_string(), 1),
|
||||
)
|
||||
.await;
|
||||
}
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(
|
||||
&ctx,
|
||||
clock_display.replacen("{}", &now.format(meridian.fmt_str()).to_string(), 1),
|
||||
)
|
||||
.await;
|
||||
}
|
||||
|
@ -225,6 +225,68 @@ async fn timezone(ctx: &Context, msg: &Message, args: String) {
|
||||
}
|
||||
}
|
||||
|
||||
#[command]
|
||||
async fn change_meridian(ctx: &Context, msg: &Message, args: String) {
|
||||
let pool;
|
||||
let lm;
|
||||
|
||||
{
|
||||
let data = ctx.data.read().await;
|
||||
|
||||
pool = data
|
||||
.get::<SQLPool>()
|
||||
.cloned()
|
||||
.expect("Could not get SQLPool from data");
|
||||
|
||||
lm = data.get::<LanguageManager>().cloned().unwrap();
|
||||
}
|
||||
|
||||
let mut user_data = UserData::from_user(&msg.author, &ctx, &pool).await.unwrap();
|
||||
|
||||
if &args == "12" {
|
||||
user_data.meridian_time = true;
|
||||
|
||||
user_data.commit_changes(&pool).await;
|
||||
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.send_message(&ctx, |m| {
|
||||
m.embed(|e| {
|
||||
e.title(lm.get(&user_data.language, "meridian/title"))
|
||||
.color(*THEME_COLOR)
|
||||
.description(lm.get(&user_data.language, "meridian/12"))
|
||||
})
|
||||
})
|
||||
.await;
|
||||
} else if &args == "24" {
|
||||
user_data.meridian_time = false;
|
||||
|
||||
user_data.commit_changes(&pool).await;
|
||||
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.send_message(&ctx, |m| {
|
||||
m.embed(|e| {
|
||||
e.title(lm.get(&user_data.language, "meridian/title"))
|
||||
.color(*THEME_COLOR)
|
||||
.description(lm.get(&user_data.language, "meridian/24"))
|
||||
})
|
||||
})
|
||||
.await;
|
||||
} else {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.send_message(&ctx, |m| {
|
||||
m.embed(|e| {
|
||||
e.title("Meridian Help")
|
||||
.color(*THEME_COLOR)
|
||||
.description(lm.get(&user_data.language, "help/meridian"))
|
||||
})
|
||||
})
|
||||
.await;
|
||||
}
|
||||
}
|
||||
|
||||
#[command]
|
||||
async fn language(ctx: &Context, msg: &Message, args: String) {
|
||||
let pool;
|
||||
|
@ -59,11 +59,7 @@ fn shorthand_displacement(seconds: u64) -> String {
|
||||
|
||||
let time_repr = format!("{:02}:{:02}:{:02}", hours, minutes, seconds);
|
||||
|
||||
if days > 0 {
|
||||
format!("{} days, {}", days, time_repr)
|
||||
} else {
|
||||
time_repr
|
||||
}
|
||||
format!("{} days, {}", days, time_repr)
|
||||
}
|
||||
|
||||
fn longhand_displacement(seconds: u64) -> String {
|
||||
@ -129,6 +125,7 @@ async fn pause(ctx: &Context, msg: &Message, args: String) {
|
||||
|
||||
let language = UserData::language_of(&msg.author, &pool).await;
|
||||
let timezone = UserData::timezone_of(&msg.author, &pool).await;
|
||||
let meridian = UserData::meridian_of(&msg.author, &pool).await;
|
||||
|
||||
let mut channel = ChannelData::from_channel(msg.channel(&ctx).await.unwrap(), &pool)
|
||||
.await
|
||||
@ -168,7 +165,7 @@ async fn pause(ctx: &Context, msg: &Message, args: String) {
|
||||
"{}",
|
||||
&timezone
|
||||
.timestamp(timestamp, 0)
|
||||
.format("%Y-%m-%d %H:%M:%S")
|
||||
.format(meridian.fmt_str())
|
||||
.to_string(),
|
||||
);
|
||||
|
||||
@ -430,6 +427,7 @@ async fn look(ctx: &Context, msg: &Message, args: String) {
|
||||
|
||||
let language = UserData::language_of(&msg.author, &pool).await;
|
||||
let timezone = UserData::timezone_of(&msg.author, &pool).await;
|
||||
let meridian = UserData::meridian_of(&msg.author, &pool).await;
|
||||
|
||||
let flags = LookFlags::from_string(&args);
|
||||
|
||||
@ -524,7 +522,7 @@ LIMIT
|
||||
let time_display = match flags.time_display {
|
||||
TimeDisplayType::Absolute => timezone
|
||||
.timestamp(reminder.time as i64, 0)
|
||||
.format("%Y-%m-%d %H:%M:%S")
|
||||
.format(meridian.fmt_str())
|
||||
.to_string(),
|
||||
|
||||
TimeDisplayType::Relative => {
|
||||
@ -641,7 +639,7 @@ WHERE
|
||||
count + 1,
|
||||
reminder.display_content(),
|
||||
reminder.channel,
|
||||
time.format("%Y-%m-%d %H:%M:%S")
|
||||
time.format(user_data.meridian().fmt_str())
|
||||
)
|
||||
});
|
||||
|
||||
|
@ -1,8 +1,9 @@
|
||||
pub const DAY: u64 = 86_400;
|
||||
pub const HOUR: u64 = 3_600;
|
||||
pub const MINUTE: u64 = 60;
|
||||
pub const HELP_STRINGS: [&'static str; 22] = [
|
||||
pub const HELP_STRINGS: [&'static str; 23] = [
|
||||
"help/lang",
|
||||
"help/meridian",
|
||||
"help/timezone",
|
||||
"help/prefix",
|
||||
"help/blacklist",
|
||||
|
@ -202,6 +202,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
|
||||
.add_command("blacklist", &moderation_cmds::BLACKLIST_COMMAND)
|
||||
.add_command("restrict", &moderation_cmds::RESTRICT_COMMAND)
|
||||
.add_command("timezone", &moderation_cmds::TIMEZONE_COMMAND)
|
||||
.add_command("meridian", &moderation_cmds::CHANGE_MERIDIAN_COMMAND)
|
||||
.add_command("prefix", &moderation_cmds::PREFIX_COMMAND)
|
||||
.add_command("lang", &moderation_cmds::LANGUAGE_COMMAND)
|
||||
.add_command("pause", &reminder_cmds::PAUSE_COMMAND)
|
||||
|
@ -180,6 +180,19 @@ pub struct UserData {
|
||||
pub dm_channel: u32,
|
||||
pub language: String,
|
||||
pub timezone: String,
|
||||
pub meridian_time: bool,
|
||||
}
|
||||
|
||||
pub struct MeridianType(bool);
|
||||
|
||||
impl MeridianType {
|
||||
pub fn fmt_str(&self) -> &str {
|
||||
if self.0 {
|
||||
"%Y-%m-%d %I:%M:%S %p"
|
||||
} else {
|
||||
"%Y-%m-%d %H:%M:%S"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl UserData {
|
||||
@ -227,6 +240,27 @@ SELECT timezone FROM users WHERE user = ?
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
pub async fn meridian_of<U>(user: U, pool: &MySqlPool) -> MeridianType
|
||||
where
|
||||
U: Into<UserId>,
|
||||
{
|
||||
let user_id = user.into().as_u64().to_owned();
|
||||
|
||||
match sqlx::query!(
|
||||
"
|
||||
SELECT meridian_time FROM users WHERE user = ?
|
||||
",
|
||||
user_id
|
||||
)
|
||||
.fetch_one(pool)
|
||||
.await
|
||||
{
|
||||
Ok(r) => MeridianType(r.meridian_time != 0),
|
||||
|
||||
Err(_) => MeridianType(false),
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn from_user(
|
||||
user: &User,
|
||||
ctx: impl CacheHttp,
|
||||
@ -237,7 +271,7 @@ SELECT timezone FROM users WHERE user = ?
|
||||
match sqlx::query_as_unchecked!(
|
||||
Self,
|
||||
"
|
||||
SELECT id, user, name, dm_channel, IF(language IS NULL, ?, language) AS language, IF(timezone IS NULL, ?, timezone) AS timezone FROM users WHERE user = ?
|
||||
SELECT id, user, name, dm_channel, IF(language IS NULL, ?, language) AS language, IF(timezone IS NULL, ?, timezone) AS timezone, meridian_time FROM users WHERE user = ?
|
||||
",
|
||||
*LOCAL_LANGUAGE, *LOCAL_TIMEZONE, user_id
|
||||
)
|
||||
@ -271,7 +305,7 @@ INSERT INTO users (user, name, dm_channel, language, timezone) VALUES (?, ?, (SE
|
||||
Ok(sqlx::query_as_unchecked!(
|
||||
Self,
|
||||
"
|
||||
SELECT id, user, name, dm_channel, language, timezone FROM users WHERE user = ?
|
||||
SELECT id, user, name, dm_channel, language, timezone, meridian_time FROM users WHERE user = ?
|
||||
",
|
||||
user_id
|
||||
)
|
||||
@ -290,11 +324,12 @@ SELECT id, user, name, dm_channel, language, timezone FROM users WHERE user = ?
|
||||
pub async fn commit_changes(&self, pool: &MySqlPool) {
|
||||
sqlx::query!(
|
||||
"
|
||||
UPDATE users SET name = ?, language = ?, timezone = ? WHERE id = ?
|
||||
UPDATE users SET name = ?, language = ?, timezone = ?, meridian_time = ? WHERE id = ?
|
||||
",
|
||||
self.name,
|
||||
self.language,
|
||||
self.timezone,
|
||||
self.meridian_time,
|
||||
self.id
|
||||
)
|
||||
.execute(pool)
|
||||
@ -305,6 +340,10 @@ UPDATE users SET name = ?, language = ?, timezone = ? WHERE id = ?
|
||||
pub fn timezone(&self) -> Tz {
|
||||
self.timezone.parse().unwrap()
|
||||
}
|
||||
|
||||
pub fn meridian(&self) -> MeridianType {
|
||||
MeridianType(self.meridian_time)
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Timer {
|
||||
|
Loading…
Reference in New Issue
Block a user