feat(discord): Commands description

- Added english commands description
- Added russian commands description
- Changed override option on /quest update to reset dates
- Commented out all deadline functionality
This commit is contained in:
Alexey 2025-12-18 13:33:42 +03:00
commit 60aa5fcb34
8 changed files with 191 additions and 22 deletions

View file

@ -36,6 +36,7 @@ fn make_quest_message_content(ctx: Context<'_>, quest: &Quest) -> String {
guild_only,
subcommands("list", "create", "update", "publish", "delete"),
required_permissions = "ADMINISTRATOR",
name_localized("ru", "квесты"),
)]
pub async fn quest(
_ctx: Context<'_>,
@ -43,11 +44,14 @@ pub async fn quest(
Ok(())
}
/// List all quests
#[poise::command(
prefix_command,
slash_command,
guild_only,
required_permissions = "ADMINISTRATOR",
name_localized("ru", "список"),
description_localized("ru", "Вывести все квесты")
)]
pub async fn list(
ctx: Context<'_>,
@ -73,7 +77,6 @@ pub enum DifficultyWrapper {
Secret,
}
impl From<DifficultyWrapper> for QuestDifficulty {
fn from(value: DifficultyWrapper) -> Self {
match &value {
@ -105,28 +108,47 @@ impl From<DateWrapper> for Date {
}
}
/// Create quest and print its identifier
#[poise::command(
prefix_command,
slash_command,
required_permissions = "ADMINISTRATOR",
guild_only,
name_localized("ru", "создать"),
description_localized("ru", "Создать квест и получить его идентификатор"),
)]
pub async fn create(
ctx: Context<'_>,
#[description = "Quest difficulty"]
#[name_localized("ru", "сложность")]
#[description_localized("ru", "Сложность квеста")]
difficulty: DifficultyWrapper,
#[description = "Reward for the quest"]
#[name_localized("ru", "награда")]
#[description_localized("ru", "Награда за квест")]
reward: u32,
#[description = "Quest name"]
#[name_localized("ru", "название")]
#[description_localized("ru", "Название квеста")]
name: String,
#[description = "Quest description"]
#[name_localized("ru", "описание")]
#[description_localized("ru", "Описание квеста")]
description: String,
#[description = "Quest answer, visible to admins"]
#[description = "Expected answer, visible when user posts their answer for review"]
#[name_localized("ru", "ответ")]
#[description_localized("ru", "Ожидаемый результат, отображаемый при проверке ответа игрока")]
answer: String,
#[description = "Optional date of publication (in format of YYYY-MM-DD, e.g. 2025-12-24)"]
#[description = "Date of publication (in format of YYYY-MM-DD, e.g. 2025-12-24)"]
#[name_localized("ru", "доступен")]
#[description_localized("ru", "Дата публикации (в формате ГГГГ-ММ-ДД, напр. 2025-12-24)")]
available: Option<DateWrapper>,
#[description = "Optional deadline (in format of YYYY-MM-DD, e.g. 2025-12-24)"]
/*
#[description = "Deadline (in format of YYYY-MM-DD, e.g. 2025-12-24)"]
#[name_localized("ru", "дедлайн")]
#[description_localized("ru", "Дедлайн (в формате ГГГГ-ММ-ДД), напр. 2025-12-24")]
deadline: Option<DateWrapper>,
*/
) -> Result<(), Error> {
let conf = &ctx.data().config;
let mut quests = conf.load_quests();
@ -141,10 +163,12 @@ pub async fn create(
None => None,
};
/*
let deadline = match deadline {
Some(dl) => Some(dl.into()),
None => None,
};
*/
let quest = Quest {
id: next_id,
@ -155,7 +179,8 @@ pub async fn create(
answer,
public: false,
available_on,
deadline,
//deadline,
..Default::default()
};
let path = conf.full_quests_path();
@ -171,33 +196,57 @@ pub async fn create(
Ok(())
}
/// Update quest values by its identifier and new given values
#[poise::command(
prefix_command,
slash_command,
required_permissions = "ADMINISTRATOR",
guild_only,
name_localized("ru", "обновить"),
description_localized("ru", "Обновить выбранные значения указанного квеста"),
)]
pub async fn update(
ctx: Context<'_>,
#[description = "Quest identifier"]
#[name_localized("ru", "идентификатор")]
#[description_localized("ru", "Идентификатор квеста")]
id: u16,
#[description = "Quest difficulty"]
#[name_localized("ru", "сложность")]
#[description_localized("ru", "Сложность квеста")]
difficulty: Option<DifficultyWrapper>,
#[description = "Reward for the quest"]
#[name_localized("ru", "награда")]
#[description_localized("ru", "Награда за квест")]
reward: Option<u32>,
#[description = "Quest name"]
#[name_localized("ru", "название")]
#[description_localized("ru", "Название квеста")]
name: Option<String>,
#[description = "Quest description"]
#[name_localized("ru", "описание")]
#[description_localized("ru", "Описание квеста")]
description: Option<String>,
#[description = "Quest answer, visible to admins"]
#[description = "Expected answer, visible when user posts their answer for review"]
#[name_localized("ru", "ответ")]
#[description_localized("ru", "Ожидаемый результат, отображаемый при проверке ответа игрока")]
answer: Option<String>,
#[description = "Date of publication (in format of YYYY-MM-DD, e.g. 2025-12-24)"]
#[name_localized("ru", "доступен")]
#[description_localized("ru", "Дата публикации (в формате ГГГГ-ММ-ДД, напр. 2025-12-24")]
available: Option<DateWrapper>,
/*
#[description = "Quest deadline (in format of YYYY-MM-DD, e.g. 2025-12-24)"]
#[name_localized("ru", "дедлайн")]
#[description_localized("ru", "Дедлайн (в формате ГГГГ-ММ-ДД, напр. 2025-12-24)")]
deadline: Option<DateWrapper>,
#[description = "Clear availability and deadline if checked"]
#[rename = "override"]
should_override: Option<bool>,
#[description = "Reset availability and deadline if checked"]
#[description_localized("ru", "Если выбрано, сбросить доступность и дедлайн")]
*/
#[description = "Reset availability if checked"]
#[description_localized("ru", "Если выбрано, сбросить доступность")]
#[name_localized("ru", "сброс")]
reset: Option<bool>,
) -> Result<(), Error> {
let conf = &ctx.data().config;
let quests = conf.load_quests();
@ -211,16 +260,16 @@ pub async fn update(
};
let available_on: Option<Date>;
let dead_line: Option<Date>;
//let dead_line: Option<Date>;
match should_override.unwrap_or(false) {
match reset.unwrap_or(false) {
true => {
available_on = available.map(|v| v.into());
dead_line = deadline.map(|v| v.into());
available_on = None;
//dead_line = None;
},
false => {
available_on = available.map_or_else(|| quest.available_on.clone(), |v| Some(v.into()));
dead_line = deadline.map_or_else(|| quest.deadline.clone(), |v| Some(v.into()));
//dead_line = deadline.map_or_else(|| quest.deadline.clone(), |v| Some(v.into()));
},
}
@ -233,7 +282,8 @@ pub async fn update(
answer: answer.unwrap_or(quest.answer.clone()),
public: quest.public,
available_on,
deadline: dead_line,
//deadline: dead_line,
..Default::default()
};
let strings = &ctx.data().strings;
@ -260,15 +310,20 @@ pub async fn update(
Ok(())
}
/// Mark quest as public and send its message in quests channel
#[poise::command(
prefix_command,
slash_command,
required_permissions = "ADMINISTRATOR",
guild_only
guild_only,
name_localized("ru", "опубликовать"),
description_localized("ru", "Отметить квест как публичный и отправить его сообщение в канал квестов"),
)]
pub async fn publish(
ctx: Context<'_>,
#[description = "Identifier of the quest to publish"]
#[description = "Quest identifier"]
#[name_localized("ru", "идентификатор")]
#[description_localized("ru", "Идентификатор квеста")]
id: u16,
) -> Result<(), Error> {
let mut quests = ctx.data().config.load_quests();
@ -308,14 +363,20 @@ pub async fn publish(
Ok(())
}
/// Delete quest (and its message, if published)
#[poise::command(
prefix_command,
slash_command,
required_permissions = "ADMINISTRATOR",
guild_only,
name_localized("ru", "удалить"),
description_localized("ru", "Удалить квест (и его сообщение, если он был опубликован)"),
)]
pub async fn delete(
ctx: Context<'_>,
#[description = "Quest identifier"]
#[name_localized("ru", "идентификатор")]
#[description_localized("ru", "Идентификатор квеста")]
id: u16,
) -> Result<(), Error> {
if let Some(msg) = find_quest_message(ctx, id).await? {