1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
use std::sync::Arc;
use time::format_description;
use twilight_model::{
application::interaction::application_command::CommandData,
gateway::payload::incoming::InteractionCreate,
http::interaction::InteractionResponseData,
id::{Id, marker::GuildMarker},
};
use twilight_util::builder::{InteractionResponseDataBuilder, embed::EmbedBuilder};
use crate::{
brain::Brain,
command::{check_command_permissions, parse_points_command_data},
database::{BoardRow, Error as DbError},
};
pub async fn revise(
brain: Arc<Brain>,
guild: Id<GuildMarker>,
create: &InteractionCreate,
data: &CommandData,
) -> InteractionResponseData {
let (point_data, date) = match parse_points_command_data(data) {
Err(e) => return e,
Ok(pcd) => match pcd.date {
Err(e) => return e,
Ok(date) => (pcd, date),
},
};
brain.create_leaderboard_if_not_exists(guild);
if let Some(err) = check_command_permissions(&brain, guild, create.member.clone().unwrap()) {
return err;
}
for user in &point_data.users {
match brain
.db
.give_user_points(guild.get(), user.get(), point_data.points)
{
Err(DbError::UserNotExist) => {
let member = brain.guild_member(guild, *user).await;
let row = BoardRow {
user_id: user.get(),
user_handle: member.handle,
user_nickname: member.nick.or(member.global_name),
points: point_data.points,
};
brain.db.add_user_to_leaderboard(guild.get(), row).unwrap();
}
_ => (),
}
//FIXME: gen 2025-08-14: do not assume UTC!
brain
.db
.revise_last_history_date(
guild.get(),
user.get(),
point_data.points,
date.assume_utc(),
)
.unwrap();
}
let datetime_fmt =
format_description::parse("[year]-[month]-[day] [hour]:[minute]:[second]").unwrap();
let points_verb = point_data.points_verb;
let users_string = point_data.user_string();
let msg = format!(
"{} points {points_verb} {users_string} on date {}",
point_data.points.abs(),
date.format(&datetime_fmt).unwrap()
);
let embed = EmbedBuilder::new().description(msg).build();
InteractionResponseDataBuilder::new()
.embeds([embed])
.build()
}
|