Skip to content

Commit

Permalink
achievement pagination
Browse files Browse the repository at this point in the history
  • Loading branch information
braindigitalis committed Aug 11, 2024
1 parent d323853 commit 03d453b
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 5 deletions.
93 changes: 93 additions & 0 deletions lang.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,97 @@
{
"opt_page": {
"en": "page",
"fr": "page",
"pt": "página",
"tr": "sayfa",
"es": "página",
"de": "seite",
"hi": "पेज",
"sv": "sida",
"ru": "страница",
"it": "pagina",
"pl": "strona",
"ko": "페이지",
"ja": "ページ",
"bg": "страница",
"zh": "页",
"nl": "pagina",
"id": "halaman",
"da": "side",
"hr": "stranica",
"lt": "puslapį",
"hu": "oldalon",
"no": "side",
"ro": "pagină",
"fi": "sivu",
"vi": "trang",
"cs": "strana",
"el": "σελίδα",
"uk": "сторінки",
"th": "หน้าหนังสือ"
},
"ACH_FOOTER": {
"en": "{0}'s Achievements (Page {1} of {2})",
"fr": "Réalisations de {0} (Page {1} sur {2})",
"pt": "Conquistas de {0} (página {1} de {2})",
"tr": "{0}'ın Başarıları (Sayfa {1} \/ {2})",
"es": "Logros de {0} (Página {1} de {2})",
"de": "{0}s Erfolge (Seite {1} von {2})",
"hi": "{0} की उपलब्धियाँ (पेज {1} {2} में से)",
"sv": "{0}s prestationer (Sida {1} av {2})",
"ru": "Достижения пользователя {0} (страница {1} из {2})",
"it": "Risultati di {0} (Pagina {1} di {2})",
"pl": "Osiągnięcia {0} (strona {1} z {2})",
"ko": "{0}의 업적({2}\/{1}페이지)",
"ja": "{0} の実績 (ページ {1}\/{2})",
"bg": "Постиженията на {0} (Страница {1} от {2})",
"zh": "{0} 的成就(第 {1} 页,共 {2} 页)",
"nl": "Prestaties van {0} (pagina {1} van {2})",
"id": "Pencapaian {0} (Halaman {1} dari {2})",
"da": "{0}s præstationer (Side {1} af {2})",
"hr": "Postignuća korisnika {0} (stranica {1} od {2})",
"lt": "{0} pasiekimai ({1} puslapis iš {2})",
"hu": "{0} eredményei ({2}\/{1}. oldal)",
"no": "{0} sine prestasjoner (Side {1} av {2})",
"ro": "Realizările lui {0} (Pagina {1} din {2})",
"fi": "Käyttäjän {0} saavutukset (sivu {1}\/{2})",
"vi": "Thành tích của {0} (Trang {1} trên {2})",
"cs": "Úspěchy uživatele {0} (strana {1} z {2})",
"el": "Επιτεύγματα του {0} (Σελίδα {1} από {2})",
"uk": "Досягнення {0} (стор. {1} з {2})",
"th": "ความสำเร็จของ {0} (หน้า {1} จาก {2})"
},
"user_achievements_page_desc": {
"en": "Page number",
"fr": "Numéro de page",
"pt": "Número da página",
"tr": "Sayfa numarası",
"es": "Número de página",
"de": "Seitenzahl",
"hi": "पृष्ठ क्रमांक",
"sv": "Sidnummer",
"ru": "Номер страницы",
"it": "Numero di pagina",
"pl": "Numer strony",
"ko": "페이지 번호",
"ja": "ページ番号",
"bg": "Номер на страницата",
"zh": "页码",
"nl": "Paginanummer",
"id": "Nomor halaman",
"da": "Sidenummer",
"hr": "Broj stranice",
"lt": "Puslapio numeris",
"hu": "Oldalszám",
"no": "Sidetall",
"ro": "Numărul paginii",
"fi": "Sivunumero",
"vi": "Số trang",
"cs": "Číslo stránky",
"el": "Αριθμός σελίδας",
"uk": "Номер сторінки",
"th": "หมายเลขหน้า"
},
"INVALIDRENAME": {
"en": "You can't rename your {} to {} because the item is a quest item, or the target item name matches that of a quest item. This could cause issues in your game.",
"fr": "Vous ne pouvez pas renommer votre {} en {} car l'objet est un objet de quête ou le nom de l'objet cible correspond à celui d'un objet de quête. Cela pourrait causer des problèmes dans votre jeu.",
Expand Down
32 changes: 27 additions & 5 deletions src/commands/achievements.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,26 @@
#include <ssod/game_player.h>
#include <ssod/emojis.h>
#include <fmt/format.h>
#include <ssod/aes.h>

using namespace i18n;

constexpr uint32_t page_size{6};

dpp::slashcommand achievements_command::register_command(dpp::cluster& bot) {
return tr(dpp::slashcommand("cmd_achievements", "achievements_desc", bot.me.id)
.set_dm_permission(true)
.add_option(dpp::command_option(dpp::co_string, "opt_user", "user_achievements_desc", false)));
.add_option(dpp::command_option(dpp::co_string, "opt_user", "user_achievements_desc", false))
.add_option(dpp::command_option(dpp::co_integer, "opt_page", "user_achievements_page_desc", false))
);
}

dpp::task<void> achievements_command::route(const dpp::slashcommand_t &event)
{
dpp::cluster& bot = *event.from->creator;
auto param = event.get_parameter("user");
auto page_p = event.get_parameter("page");
uint32_t page{1};
std::string user;
player p;
bool self{false};
Expand All @@ -48,6 +55,9 @@ dpp::task<void> achievements_command::route(const dpp::slashcommand_t &event)
} else {
user = std::get<std::string>(param);
}
if (page_p.index() != 0) {
page = std::get<int64_t>(page_p);
}
auto rs = co_await db::co_query("SELECT * FROM game_users WHERE name = ?", {user});
if (rs.empty()) {
event.reply(dpp::message(tr(self ? "NOPROFILE" : "NOSUCHUSER", event)).set_flags(dpp::m_ephemeral));
Expand All @@ -58,6 +68,17 @@ dpp::task<void> achievements_command::route(const dpp::slashcommand_t &event)

content << "## " + tr("ACHIEVEMENTS", event) + "\n\n";

auto page_check = co_await db::co_query(
"SELECT CEIL(COUNT(*) / ?) as page_count FROM `achievements_unlocked`"
"JOIN achievements ON achievement_id = achievements.id AND achievements_unlocked.user_id = ? WHERE "
"(achievements.secret = 0 OR (SELECT COUNT(*) FROM achievements_unlocked self WHERE self.achievement_id = achievements_unlocked.achievement_id AND self.user_id = ?) > 0) "
"ORDER BY achievements_unlocked.created_at DESC",
{ page_size, rs[0].at("user_id"), event.command.usr.id }
);

uint32_t max_pages = atoi(page_check.empty() ? "1" : page_check[0].at("page_count"));
page = std::max(1U, std::min(page, max_pages));

/**
* User can view all non-secret achievements, or secret achievements they have unlocked in common with the target user.
* Achievements are listed in reverse date order.
Expand All @@ -66,8 +87,9 @@ dpp::task<void> achievements_command::route(const dpp::slashcommand_t &event)
"SELECT achievements.*, DATE_FORMAT(FROM_UNIXTIME(achievements_unlocked.created_at), '%D %b %Y, %H:%i') AS unlock_date FROM `achievements_unlocked`"
"JOIN achievements ON achievement_id = achievements.id AND achievements_unlocked.user_id = ? WHERE "
"(achievements.secret = 0 OR (SELECT COUNT(*) FROM achievements_unlocked self WHERE self.achievement_id = achievements_unlocked.achievement_id AND self.user_id = ?) > 0) "
"ORDER BY achievements_unlocked.created_at DESC",
{ rs[0].at("user_id"), event.command.usr.id }
"ORDER BY achievements_unlocked.created_at DESC "
"LIMIT ?,?",
{ rs[0].at("user_id"), event.command.usr.id, (page - 1) * page_size, page_size }
);

size_t c{};
Expand Down Expand Up @@ -97,7 +119,7 @@ dpp::task<void> achievements_command::route(const dpp::slashcommand_t &event)
content << tr("UNLOCKED", event) << " " << achievement.at("unlock_date") << "\n\n";
++c;

if (content.str().length() > 5700) {
if (content.str().length() > 5500) {
content << "(and " << (ach.size() - c) << " more...)";
break;
}
Expand All @@ -107,7 +129,7 @@ dpp::task<void> achievements_command::route(const dpp::slashcommand_t &event)
.set_url("https://ssod.org/")
.set_title(tr("ACHIEVEMENTS_LIST", event) + ": " + dpp::utility::markdown_escape(user))
.set_footer(dpp::embed_footer{
.text = tr("REQUESTED_BY", event, event.command.usr.format_username()),
.text = tr("ACH_FOOTER", event, dpp::utility::markdown_escape(user), page, max_pages),
.icon_url = bot.me.get_avatar_url(),
.proxy_url = "",
})
Expand Down

0 comments on commit 03d453b

Please sign in to comment.