HELPER PROFILES ID-КАРТЫ ИГРОКОВ /PROFILE / AVATAR CDN / SHOP.DB / REPUTATION.DB / PROCESS POOL
Profiles превращает сухие цифры экономики и репутации в красивую личную ID-карту участника. Игрок вводит /profile, выбирает стиль Glass / Neon / Minimal / Golden, а HELPER подтягивает аватар, баланс, влияние, ранг и отправляет готовую WebP-картинку прямо в Discord.
Что делает Profiles
Это визуальная карточка личности участника. Внутри неё: Discord-аватар, display name, статус по репутации, очки влияния, баланс экономики и прогресс до следующего ранга. Карточка генерируется как WebP-файл и отправляется в embed.
Команда
Игрок вызывает /profile, выбирает user и style.
Данные
Бот читает balance из экономики и points из reputation.
Рендер
ProfileRenderer собирает WebP-карту 850×320.
Discord
Картинка отправляется как attachment://id_card_*.webp.
Больше информации картинками
Полный путь глазами игрока и администратора: команда, выбор пользователя, выбор стиля, загрузка аватара, готовая WebP-карточка, cache-hit, пустые данные и disabled-state.
Команда Discord
У модуля одна главная команда. Она открыта игрокам, но защищена cooldown 10 секунд на пользователя, чтобы массовые рендеры не грузили сервер.
/profile user:@Player style:glassПоказывает ID-карту выбранного пользователя. Если user не указан — показывает профиль вызвавшего игрока.
🪞 Glassmorphism → glass
🌃 Neon Cyberpunk → neon
🌑 Minimal Dark → minimal
👑 Golden Luxury → goldenСтиль влияет на blur, glow, overlay, тени, цвет акцента и настроение карточки.
@commands.cooldown(1, 10, BucketType.user)Если игрок спамит команду, он получает сообщение: “Подождите N секунд”.
guild required → ❌ Профили доступны только на сервере.В личных сообщениях модуль не работает, потому что данные берутся по guild_id.
Путь профиля от команды до WebP
slash
module on
DB read
CDN fetch
process pool
attachment
User lock
Для одного guild_id/user_id не запускается несколько одинаковых рендеров одновременно.
Active renders
Если такой cache_filename уже рендерится, второй запрос ждёт existing future.
Safe errors
Timeout Discord CDN, ошибка аватара или render exception возвращаются понятным сообщением.
Что видит игрок
Что делает администратор
Включает модуль
На сайте включает profiles/profile в module_states.json.
Экономика
Баланс должен попадать в shop.db с guild_id и user_id.
Репутация
Очки influence должны попадать в reputation.db.
Фоны
Можно положить локальные изображения в backgrounds/ для общего визуального вайба карточек.
Важный момент
У этого модуля нет сложной web-настройки стилей: сайт управляет доступностью, а конкретный стиль выбирается пользователем в Discord-команде.
Четыре визуальных стиля
Стили встроены в renderer и меняют blur, glow, overlay, тени и настроение ID-карты.
Glass
Мягкое стекло, прозрачные pill-блоки, аккуратный glow и premium-визуал.
Neon
Более контрастный cyberpunk-вид с сильным свечением и тёмной подложкой.
Minimal
Строгая карточка без лишнего glow, подходит для спокойных серверов.
Golden
Luxury-режим для VIP, топовых игроков и донатерских community.
Откуда берутся цифры
ProfileDB ищет совместимую таблицу и колонку, но принцип строгий: таблица должна содержать guild_id и user_id, иначе данные не используются, чтобы не смешивать серверы клиентов.
shop.dbосновная база экономики.tablesusers, shop_users, economy_users, balances.score columnsbalance, money, cash, coins, points.WHEREguild_id + user_id текущего сервера.reputation.dbосновная база кармы.tablesserver_reputation, reputation, users, user_reputation, reputation_users.score columnspoints, reputation, rep, karma, score.rankpoints превращаются в статус и цвет ранга.Кэш и скорость
Профили рендерятся тяжело, поэтому модуль использует ProcessPoolExecutor, disk cache, user lock и active render future.
avatar bytes
cache file
read cache
same render
new render
old files
guild_idодин user на разных серверах получает разные файлы.user_idвладелец карточки.styleglass/neon/minimal/golden.avatar_hashсмена аватара пересобирает card.balance + pointsсмена цифр создаёт новый WebP.Настройка на сайте
В текущем модуле сайт управляет главным переключателем доступности через data/module_states.json. Детальные визуальные стили выбираются пользователем в команде.
profilesосновной ключ модуля.profileкороткий alias.id_cards / id-cardsстарые названия ID-карт.cards / profile_cardsдополнительные alias.default_styleстиль по умолчанию сервера.access_role_idsограничить команду ролями.background_keyотдельный фон из Visual Core.currency_labelзаменить PTS на ₽, COINS или RP.Если модуль выключен
Если profiles выключен в module_states.json, команда не запускает рендер и показывает красный disabled embed.
shop.dbбаланс игроков не удаляется.reputation.dbрепутация игроков не удаляется.cache/profilesстарые cache-файлы не критичны и могут быть пересозданы.after enableпосле включения команда снова генерирует ID-карты.Карта технической логики
data/shop.db — баланс игрока.
data/reputation.db — reputation/karma/points игрока.
data/cache/profiles — готовые WebP-карточки.
data/module_states.json — включение/выключение profiles.
backgrounds/ и fonts/ используются renderer.
WIDTH850×320AVATAR240 pxSTYLES4 режимаCOOLDOWN10 секундCDN LIMIT4 MBTTLstate cache 10sprofile_cardslash-команда /profile.send_profileпроверка сервера, состояния, defer и отправка embed.fetch_avatar_bytesскачивание avatar PNG с Discord CDN.render_or_get_cachedisk cache, active future, process pool.cleanup_locksраз в 30 минут чистит неактивные user locks.get_backgroundлокальный фон из backgrounds/ или blur-аватар.draw_avatarкругло-скруглённый avatar + glow.draw_user_infousername, underline и акцент.draw_stat_pillСТАТУС, ВЛИЯНИЕ, БАЛАНС.draw_progress_barпрогресс до следующего уровня.Ошибки и решения
Почему у игрока нули?
В shop.db или reputation.db нет записи по guild_id/user_id, либо таблица не содержит нужную score-колонку.
Можно посмотреть профиль другого игрока?
Да. В /profile есть параметр user, поэтому можно выбрать участника сервера.
Почему картинка не обновилась сразу?
Если avatar_hash, стиль, balance и points такие же, бот отдаёт готовый WebP из cache.
Почему Discord CDN не отвечает?
Бот отдаёт timeout/ошибку аватара. Обычно достаточно повторить команду позже.
Почему профиль не работает в ЛС?
Профиль зависит от guild_id, потому что баланс и репутация считаются отдельно для каждого сервера.
Почему emoji пропали из ника?
Emoji очищаются перед Pillow-рендером, чтобы старая font-система не ломала картинку.