timezone_of method for more lazy-storage. fix for del command raising issues if 0 is written. fix for get_language not recognising
This commit is contained in:
parent
d8bf0240e4
commit
012d90e832
@ -169,11 +169,13 @@ async fn clock(ctx: &Context, msg: &Message, args: String) {
|
||||
.expect("Could not get SQLPool from data");
|
||||
|
||||
let lm = data.get::<LanguageManager>().unwrap();
|
||||
let user_data = UserData::from_user(&msg.author, &ctx, &pool).await.unwrap();
|
||||
|
||||
let now = Utc::now().with_timezone(&user_data.timezone());
|
||||
let language = UserData::language_of(&msg.author, &pool).await;
|
||||
let timezone = UserData::timezone_of(&msg.author, &pool).await;
|
||||
|
||||
let clock_display = lm.get(&user_data.language, "clock/time");
|
||||
let now = Utc::now().with_timezone(&timezone);
|
||||
|
||||
let clock_display = lm.get(&language, "clock/time");
|
||||
|
||||
if args == "12" {
|
||||
let _ = msg
|
||||
|
@ -42,7 +42,7 @@ async fn blacklist(ctx: &Context, msg: &Message, args: String) {
|
||||
lm = data.get::<LanguageManager>().cloned().unwrap();
|
||||
}
|
||||
|
||||
let user_data = UserData::from_user(&msg.author, &ctx, &pool).await.unwrap();
|
||||
let language = UserData::language_of(&msg.author, &pool).await;
|
||||
|
||||
let capture_opt = REGEX_CHANNEL
|
||||
.captures(&args)
|
||||
@ -71,24 +71,24 @@ async fn blacklist(ctx: &Context, msg: &Message, args: String) {
|
||||
if local {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(&ctx, lm.get(&user_data.language, "blacklist/added"))
|
||||
.say(&ctx, lm.get(&language, "blacklist/added"))
|
||||
.await;
|
||||
} else {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(&ctx, lm.get(&user_data.language, "blacklist/added_from"))
|
||||
.say(&ctx, lm.get(&language, "blacklist/added_from"))
|
||||
.await;
|
||||
}
|
||||
} else {
|
||||
if local {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(&ctx, lm.get(&user_data.language, "blacklist/removed"))
|
||||
.say(&ctx, lm.get(&language, "blacklist/removed"))
|
||||
.await;
|
||||
} else {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(&ctx, lm.get(&user_data.language, "blacklist/removed_from"))
|
||||
.say(&ctx, lm.get(&language, "blacklist/removed_from"))
|
||||
.await;
|
||||
}
|
||||
}
|
||||
@ -215,27 +215,25 @@ async fn prefix(ctx: &Context, msg: &Message, args: String) {
|
||||
let mut guild_data = GuildData::from_guild(msg.guild(&ctx).await.unwrap(), &pool)
|
||||
.await
|
||||
.unwrap();
|
||||
let user_data = UserData::from_user(&msg.author, &ctx, &pool).await.unwrap();
|
||||
let language = UserData::language_of(&msg.author, &pool).await;
|
||||
|
||||
if args.len() > 5 {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(&ctx, lm.get(&user_data.language, "prefix/too_long"))
|
||||
.say(&ctx, lm.get(&language, "prefix/too_long"))
|
||||
.await;
|
||||
} else if args.is_empty() {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(&ctx, lm.get(&user_data.language, "prefix/no_argument"))
|
||||
.say(&ctx, lm.get(&language, "prefix/no_argument"))
|
||||
.await;
|
||||
} else {
|
||||
guild_data.prefix = args;
|
||||
guild_data.commit_changes(&pool).await;
|
||||
|
||||
let content = lm.get(&user_data.language, "prefix/success").replacen(
|
||||
"{prefix}",
|
||||
&guild_data.prefix,
|
||||
1,
|
||||
);
|
||||
let content =
|
||||
lm.get(&language, "prefix/success")
|
||||
.replacen("{prefix}", &guild_data.prefix, 1);
|
||||
|
||||
let _ = msg.channel_id.say(&ctx, content).await;
|
||||
}
|
||||
@ -259,7 +257,7 @@ async fn restrict(ctx: &Context, msg: &Message, args: String) {
|
||||
lm = data.get::<LanguageManager>().cloned().unwrap();
|
||||
}
|
||||
|
||||
let user_data = UserData::from_user(&msg.author, &ctx, &pool).await.unwrap();
|
||||
let language = UserData::language_of(&msg.author, &pool).await;
|
||||
let guild_data = GuildData::from_guild(msg.guild(&ctx).await.unwrap(), &pool)
|
||||
.await
|
||||
.unwrap();
|
||||
@ -292,7 +290,7 @@ DELETE FROM command_restrictions WHERE role_id = (SELECT id FROM roles WHERE rol
|
||||
if commands.is_empty() {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(&ctx, lm.get(&user_data.language, "restrict/disabled"))
|
||||
.say(&ctx, lm.get(&language, "restrict/disabled"))
|
||||
.await;
|
||||
} else {
|
||||
let _ = sqlx::query!(
|
||||
@ -317,7 +315,7 @@ INSERT INTO command_restrictions (role_id, command) VALUES ((SELECT id FROM role
|
||||
if res.is_err() {
|
||||
println!("{:?}", res);
|
||||
|
||||
let content = lm.get(&user_data.language, "restrict/failure").replacen(
|
||||
let content = lm.get(&language, "restrict/failure").replacen(
|
||||
"{command}",
|
||||
&command,
|
||||
1,
|
||||
@ -329,7 +327,7 @@ INSERT INTO command_restrictions (role_id, command) VALUES ((SELECT id FROM role
|
||||
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(&ctx, lm.get(&user_data.language, "restrict/enabled"))
|
||||
.say(&ctx, lm.get(&language, "restrict/enabled"))
|
||||
.await;
|
||||
}
|
||||
}
|
||||
@ -360,15 +358,15 @@ WHERE
|
||||
.map(|row| format!("<@&{}> can use {}", row.role, row.command))
|
||||
.collect::<Vec<String>>()
|
||||
.join("\n");
|
||||
let display =
|
||||
lm.get(&user_data.language, "restrict/allowed")
|
||||
.replacen("{}", &display_inner, 1);
|
||||
let display = lm
|
||||
.get(&language, "restrict/allowed")
|
||||
.replacen("{}", &display_inner, 1);
|
||||
|
||||
let _ = msg.channel_id.say(&ctx, display).await;
|
||||
} else {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(&ctx, lm.get(&user_data.language, "restrict/help"))
|
||||
.say(&ctx, lm.get(&language, "restrict/help"))
|
||||
.await;
|
||||
}
|
||||
}
|
||||
@ -391,7 +389,7 @@ async fn alias(ctx: &Context, msg: &Message, args: String) {
|
||||
lm = data.get::<LanguageManager>().cloned().unwrap();
|
||||
}
|
||||
|
||||
let user_data = UserData::from_user(&msg.author, &ctx, &pool).await.unwrap();
|
||||
let language = UserData::language_of(&msg.author, &pool).await;
|
||||
|
||||
let guild_id = msg.guild_id.unwrap().as_u64().to_owned();
|
||||
|
||||
@ -444,14 +442,14 @@ DELETE FROM command_aliases WHERE name = ? AND guild_id = (SELECT id FROM guilds
|
||||
.unwrap();
|
||||
|
||||
let content = lm
|
||||
.get(&user_data.language, "alias/removed")
|
||||
.get(&language, "alias/removed")
|
||||
.replace("{count}", &deleted_count.count.to_string());
|
||||
|
||||
let _ = msg.channel_id.say(&ctx, content).await;
|
||||
} else {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(&ctx, lm.get(&user_data.language, "alias/help"))
|
||||
.say(&ctx, lm.get(&language, "alias/help"))
|
||||
.await;
|
||||
}
|
||||
}
|
||||
@ -475,9 +473,7 @@ UPDATE command_aliases SET command = ? WHERE guild_id = (SELECT id FROM guilds W
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
let content = lm
|
||||
.get(&user_data.language, "alias/created")
|
||||
.replace("{name}", name);
|
||||
let content = lm.get(&language, "alias/created").replace("{name}", name);
|
||||
|
||||
let _ = msg.channel_id.say(&ctx, content).await;
|
||||
} else {
|
||||
@ -499,7 +495,7 @@ SELECT command FROM command_aliases WHERE guild_id = (SELECT id FROM guilds WHER
|
||||
},
|
||||
|
||||
Err(_) => {
|
||||
let content = lm.get(&user_data.language, "alias/not_found").replace("{name}", name);
|
||||
let content = lm.get(&language, "alias/not_found").replace("{name}", name);
|
||||
|
||||
let _ = msg.channel_id.say(&ctx, content).await;
|
||||
},
|
||||
@ -509,9 +505,7 @@ SELECT command FROM command_aliases WHERE guild_id = (SELECT id FROM guilds WHER
|
||||
}
|
||||
} else {
|
||||
let prefix = GuildData::prefix_from_id(msg.guild_id, &pool).await;
|
||||
let content = lm
|
||||
.get(&user_data.language, "alias/help")
|
||||
.replace("{prefix}", &prefix);
|
||||
let content = lm.get(&language, "alias/help").replace("{prefix}", &prefix);
|
||||
|
||||
let _ = msg.channel_id.say(&ctx, content).await;
|
||||
}
|
||||
|
@ -128,7 +128,9 @@ async fn pause(ctx: &Context, msg: &Message, args: String) {
|
||||
lm = data.get::<LanguageManager>().cloned().unwrap();
|
||||
}
|
||||
|
||||
let user_data = UserData::from_user(&msg.author, &ctx, &pool).await.unwrap();
|
||||
let language = UserData::language_of(&msg.author, &pool).await;
|
||||
let timezone = UserData::timezone_of(&msg.author, &pool).await;
|
||||
|
||||
let mut channel = ChannelData::from_channel(msg.channel(&ctx).await.unwrap(), &pool)
|
||||
.await
|
||||
.unwrap();
|
||||
@ -142,16 +144,16 @@ async fn pause(ctx: &Context, msg: &Message, args: String) {
|
||||
if channel.paused {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(&ctx, lm.get(&user_data.language, "pause/paused_indefinite"))
|
||||
.say(&ctx, lm.get(&language, "pause/paused_indefinite"))
|
||||
.await;
|
||||
} else {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(&ctx, lm.get(&user_data.language, "pause/unpaused"))
|
||||
.say(&ctx, lm.get(&language, "pause/unpaused"))
|
||||
.await;
|
||||
}
|
||||
} else {
|
||||
let parser = TimeParser::new(args, user_data.timezone());
|
||||
let parser = TimeParser::new(args, timezone);
|
||||
let pause_until = parser.timestamp();
|
||||
|
||||
match pause_until {
|
||||
@ -163,10 +165,9 @@ async fn pause(ctx: &Context, msg: &Message, args: String) {
|
||||
|
||||
channel.commit_changes(&pool).await;
|
||||
|
||||
let content = lm.get(&user_data.language, "pause/paused_until").replace(
|
||||
let content = lm.get(&language, "pause/paused_until").replace(
|
||||
"{}",
|
||||
&user_data
|
||||
.timezone()
|
||||
&timezone
|
||||
.timestamp(timestamp, 0)
|
||||
.format("%Y-%m-%d %H:%M:%S")
|
||||
.to_string(),
|
||||
@ -178,7 +179,7 @@ async fn pause(ctx: &Context, msg: &Message, args: String) {
|
||||
Err(_) => {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(&ctx, lm.get(&user_data.language, "pause/invalid_time"))
|
||||
.say(&ctx, lm.get(&language, "pause/invalid_time"))
|
||||
.await;
|
||||
}
|
||||
}
|
||||
@ -277,19 +278,21 @@ async fn nudge(ctx: &Context, msg: &Message, args: String) {
|
||||
lm = data.get::<LanguageManager>().cloned().unwrap();
|
||||
}
|
||||
|
||||
let user_data = UserData::from_user(&msg.author, &ctx, &pool).await.unwrap();
|
||||
let language = UserData::language_of(&msg.author, &pool).await;
|
||||
let timezone = UserData::timezone_of(&msg.author, &pool).await;
|
||||
|
||||
let mut channel = ChannelData::from_channel(msg.channel(&ctx).await.unwrap(), &pool)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
if args.is_empty() {
|
||||
let content = lm
|
||||
.get(&user_data.language, "nudge/no_argument")
|
||||
.get(&language, "nudge/no_argument")
|
||||
.replace("{nudge}", &format!("{}s", &channel.nudge.to_string()));
|
||||
|
||||
let _ = msg.channel_id.say(&ctx, content).await;
|
||||
} else {
|
||||
let parser = TimeParser::new(args, user_data.timezone.parse().unwrap());
|
||||
let parser = TimeParser::new(args, timezone);
|
||||
let nudge_time = parser.displacement();
|
||||
|
||||
match nudge_time {
|
||||
@ -297,14 +300,14 @@ async fn nudge(ctx: &Context, msg: &Message, args: String) {
|
||||
if displacement < i16::MIN as i64 || displacement > i16::MAX as i64 {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(&ctx, lm.get(&user_data.language, "nudge/invalid_time"))
|
||||
.say(&ctx, lm.get(&language, "nudge/invalid_time"))
|
||||
.await;
|
||||
} else {
|
||||
channel.nudge = displacement as i16;
|
||||
|
||||
channel.commit_changes(&pool).await;
|
||||
|
||||
let response = lm.get(&user_data.language, "nudge/success").replacen(
|
||||
let response = lm.get(&language, "nudge/success").replacen(
|
||||
"{}",
|
||||
&displacement.to_string(),
|
||||
1,
|
||||
@ -317,7 +320,7 @@ async fn nudge(ctx: &Context, msg: &Message, args: String) {
|
||||
Err(_) => {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(&ctx, lm.get(&user_data.language, "nudge/invalid_time"))
|
||||
.say(&ctx, lm.get(&language, "nudge/invalid_time"))
|
||||
.await;
|
||||
}
|
||||
}
|
||||
@ -425,7 +428,8 @@ async fn look(ctx: &Context, msg: &Message, args: String) {
|
||||
lm = data.get::<LanguageManager>().cloned().unwrap();
|
||||
}
|
||||
|
||||
let user_data = UserData::from_user(&msg.author, &ctx, &pool).await.unwrap();
|
||||
let language = UserData::language_of(&msg.author, &pool).await;
|
||||
let timezone = UserData::timezone_of(&msg.author, &pool).await;
|
||||
|
||||
let flags = LookFlags::from_string(&args);
|
||||
|
||||
@ -549,15 +553,14 @@ LIMIT
|
||||
if reminders.is_empty() {
|
||||
let _ = msg
|
||||
.channel_id
|
||||
.say(&ctx, lm.get(&user_data.language, "look/no_reminders"))
|
||||
.say(&ctx, lm.get(&language, "look/no_reminders"))
|
||||
.await;
|
||||
} else {
|
||||
let inter = lm.get(&user_data.language, "look/inter");
|
||||
let inter = lm.get(&language, "look/inter");
|
||||
|
||||
let display = reminders.iter().map(|reminder| {
|
||||
let time_display = match flags.time_display {
|
||||
TimeDisplayType::Absolute => user_data
|
||||
.timezone()
|
||||
TimeDisplayType::Absolute => timezone
|
||||
.timestamp(reminder.time as i64, 0)
|
||||
.format("%Y-%m-%d %H:%M:%S")
|
||||
.to_string(),
|
||||
@ -703,6 +706,7 @@ WHERE
|
||||
.filter_map(|i| {
|
||||
i.parse::<usize>()
|
||||
.ok()
|
||||
.filter(|val| val > &0)
|
||||
.map(|val| reminder_ids.get(val - 1))
|
||||
.flatten()
|
||||
})
|
||||
|
@ -36,9 +36,13 @@ impl LanguageManager {
|
||||
}
|
||||
|
||||
pub fn get_language(&self, language: &str) -> Option<&str> {
|
||||
let language_normal = language.to_lowercase();
|
||||
|
||||
self.languages
|
||||
.iter()
|
||||
.filter(|(k, v)| k.to_lowercase() == language || v.to_lowercase() == language)
|
||||
.filter(|(k, v)| {
|
||||
k.to_lowercase() == language_normal || v.to_lowercase() == language_normal
|
||||
})
|
||||
.map(|(k, _)| k.as_str())
|
||||
.next()
|
||||
}
|
||||
|
@ -1,6 +1,11 @@
|
||||
use serenity::{
|
||||
http::CacheHttp,
|
||||
model::{channel::Channel, guild::Guild, id::GuildId, user::User},
|
||||
model::{
|
||||
channel::Channel,
|
||||
guild::Guild,
|
||||
id::{GuildId, UserId},
|
||||
user::User,
|
||||
},
|
||||
};
|
||||
|
||||
use sqlx::MySqlPool;
|
||||
@ -178,25 +183,50 @@ pub struct UserData {
|
||||
}
|
||||
|
||||
impl UserData {
|
||||
pub async fn language_of(user: &User, pool: &MySqlPool) -> String {
|
||||
let user_id = user.id.as_u64().to_owned();
|
||||
pub async fn language_of<U>(user: U, pool: &MySqlPool) -> String
|
||||
where
|
||||
U: Into<UserId>,
|
||||
{
|
||||
let user_id = user.into().as_u64().to_owned();
|
||||
|
||||
match sqlx::query!(
|
||||
"
|
||||
SELECT IF(language IS NULL, ?, language) AS language FROM users WHERE user = ?
|
||||
SELECT language FROM users WHERE user = ?
|
||||
",
|
||||
*LOCAL_LANGUAGE,
|
||||
user_id
|
||||
)
|
||||
.fetch_one(pool)
|
||||
.await
|
||||
{
|
||||
Ok(r) => r.language.unwrap(),
|
||||
Ok(r) => r.language,
|
||||
|
||||
Err(_) => LOCAL_LANGUAGE.clone(),
|
||||
}
|
||||
}
|
||||
|
||||
pub async fn timezone_of<U>(user: U, pool: &MySqlPool) -> Tz
|
||||
where
|
||||
U: Into<UserId>,
|
||||
{
|
||||
let user_id = user.into().as_u64().to_owned();
|
||||
|
||||
match sqlx::query!(
|
||||
"
|
||||
SELECT timezone FROM users WHERE user = ?
|
||||
",
|
||||
user_id
|
||||
)
|
||||
.fetch_one(pool)
|
||||
.await
|
||||
{
|
||||
Ok(r) => r.timezone,
|
||||
|
||||
Err(_) => LOCAL_TIMEZONE.clone(),
|
||||
}
|
||||
.parse()
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
pub async fn from_user(
|
||||
user: &User,
|
||||
ctx: impl CacheHttp,
|
||||
|
Loading…
Reference in New Issue
Block a user