HELPER REPUTATION СОЦИАЛЬНАЯ КАРМА /REP / KARMA / REP_TOP / RANKS / SHOP DISCOUNTS / SQLITE WAL
Reputation превращает обычные плюсы и минусы в живую социальную экономику сервера. Игроки оценивают друг друга, получают очки влияния, ранги, скидки магазина и Discord-роли. Владелец настраивает ранги через сайт, а HELPER безопасно синхронизирует роли через очередь, не перегружая Discord API.
Что делает Reputation
Это социальный рейтинг сервера. У каждого пользователя есть очки влияния внутри конкретного guild_id. Игроки могут повышать или понижать репутацию другим участникам, но не себе и не ботам. Ранг влияет на embed-цвет, скидку магазина, силу голоса и роль Discord.
Голос
Игрок вызывает /rep и выбирает “Повысить” или “Понизить”.
Вес
Система смотрит очки голосующего и считает силу изменения.
Ранг
Цель получает новый статус, цвет, скидку и возможную роль.
История
Каждый голос сохраняется в reputation_events с итоговыми очками.
Больше информации картинками
Ниже показан полный сценарий: голос, cooldown, социальный паспорт, топ сервера, настройка рангов, очередь ролей, скидка магазина, миграция старой базы и safe disabled-state.
Команды Discord
Команды разделены на игровые, пользовательские и административные. Все команды проверяют состояние модуля, работают только на сервере и не смешивают данные разных guild_id.
/rep user:@Player действие:ПовыситьПовышает или понижает социальную репутацию выбранного участника. Нельзя оценивать себя и ботов. Slash cooldown — 5 секунд, а голосовой cooldown — 12 часов.
/karma user:@PlayerПоказывает социальный паспорт: ранг, очки, скидку/наценку и визуальную шкалу доверия. Если user пустой — показывает профиль вызвавшего.
/rep_top limit:10Показывает топ социальной кармы текущего сервера. Limit ограничен диапазоном от 1 до 20.
/rep_sync_meИгрок вручную ставит свою текущую роль репутации в очередь. Cooldown команды — 30 секунд.
/rep_sync_allАдминистратор пересинхронизирует роли всех пользователей с репутацией на сервере. Cooldown — 60 секунд на guild.
/rep_migrate_dbOwner-команда переносит старую data/reputation.json в SQLite для текущего сервера и ставит пользователей в очередь ролей.
Путь голоса от /rep до роли
команда
self/bot/state
12 часов
1/2/5/10
atomic tx
queue sync
Atomic vote
Операция делает cooldown, начисление, итоговые очки и audit event внутри одной транзакции.
ManagedLock
На пользователя есть безопасный async lock, чтобы параллельные команды не ломали голосование.
Queue worker
Выдача ролей вынесена в worker, который проверяет права, hierarchy и делает retry на временных ошибках API.
Что видит обычный игрок
Что делает администратор
Настраивает ранги
Название, минимум очков, скидка/наценка, цвет и role_id для каждого статуса.
Ставит роли ниже бота
Роль HELPER должна быть выше ролей репутации, иначе Discord запретит выдачу.
Синхронизирует всех
/rep_sync_all ставит в очередь до 5000 пользователей сервера.
Следит за экономикой
Скидки рангов влияют на магазин через get_discount.
Практический совет
Перед массовой синхронизацией проверь: у бота есть Manage Roles, а все role_id рангов ниже роли бота. Тогда очередь отработает без hierarchy-blocked предупреждений.
Ранги, скидки и вес голоса
По умолчанию модуль уже имеет 5 рангов. Их можно заменить на сайте: изменить пороги, названия, цвета, роль и discount. Отрицательный discount работает как наценка.
🌚 Изгой
От -10000 очков. Наценка 20%, слабый вес голоса 1. Подходит для негативной репутации.
👤 Прохожий
Базовый статус около нуля. Без скидки, обычный вес голоса.
🔰 АКТИВНЫЙ
Первые плюсы доверия. Скидка 5%, игрок уже заметен в социальной системе.
🌟 ДОВЕРЕННЫЙ
Стабильная репутация. Скидка 15%, вес голоса 5.
👑 ЛЕГЕНДА
Топовый статус. Скидка 30%, вес голоса 10 и отдельная роль.
points >= 501голос меняет цель на 10 очков.points >= 101голос меняет цель на 5 очков.points < 0голос меняет цель на 1 очко.остальныеголос меняет цель на 2 очка.0.15скидка 15%.15сайт может прислать процент — модуль переведёт в 0.15.-0.20наценка 20% для плохой репутации.limitзначение ограничено диапазоном -95% до +95%.Настройка на сайте
Dashboard сохраняет настройки в data/reputation_settings.json. Сайт может отправить ranks списком или ranks_json строкой. Cog каждые 10 секунд применяет deploy_requested, нормализует ранги, сбрасывает флаг и ставит пользователей в очередь ролей.
nameназвание ранга, например 🌟 ДОВЕРЕННЫЙ.minминимум очков для получения ранга.discountскидка или наценка для магазина.colorцвет embed-карточек в hex.role_idDiscord-роль, которую нужно выдать за статус.deploy_requestedфлаг сайта для применения изменений.reputationосновной ключ.rep / karmaкороткие aliases.social_karmaalias для социальной кармы.социальная_кармарусский alias.Синхронизация ролей
Роли не выдаются хаотично внутри команд. Модуль ставит задачу в очередь, а отдельный worker обрабатывает её: снимает старые rep-роли, выдаёт нужную, проверяет Manage Roles и hierarchy.
current points
role_id
10k max
member
permissions
add/remove
guild existsсервер должен быть в кэше бота.member existsесли нет в cache, бот пытается fetch_member.Manage Rolesбез права бот не трогает роли.role hierarchyроль ранга должна быть ниже роли бота.retryпри 429/5xx делает повторы с задержкой.Связь с магазином и профилями
Что хранится в SQLite
Данные репутации хранятся в data/reputation.db с WAL-режимом, foreign_keys и busy_timeout. Все записи разделяются по guild_id и user_id.
server_reputationpoints по guild/uservote_cooldownslast_vote голосующегоreputation_eventsaudit historyidx_reputation_pointsбыстрый topidx_rep_events_targetистория целиWALsqlite journalvoter_idкто поставил плюс или минус.target_idкому изменили репутацию.actionadd или sub.changeфактическое изменение: +1/+2/+5/+10 или минус.target_points_afterочки цели после операции.created_atвремя голосования в ISO.Если модуль выключен
Отключение через module_states.json не удаляет очки, историю, ранги или роли. Команды просто возвращают disabled embed и не выполняют изменение репутации.
server_reputationочки пользователей остаются.reputation_eventsистория голосов не удаляется.reputation_settings.jsonранги и role_id остаются.после включениякоманды снова работают, а роли можно пересинхронизировать.Карта технической логики
ReputationCog, команды, role worker, site_sync_loop, shutdown и integration API.
ReputationDB, atomic vote, tables, cooldowns, top users и legacy import.
normalization ranks/ranks_json, deploy_requested, module state aliases.
parse_bool, parse_color, normalize_rank, normalize_discount, disabled_embed и JSON locks.
ManagedLock с active_users и безопасным release.
COOLDOWN_HOURS12 часовROLE_QUEUE10 000 задачSITE_SYNC10 секундMAX_USERS5000 за resyncLOCK_GC30 минутSHUTDOWN15 секунд_ensure_reputation_enabledguild-only и module state.self voteнельзя оценивать самого себя.bot voteботы не участвуют в социальной системе.CommandOnCooldownотдельные slash cooldown для команд.CooldownActive12-часовой бизнес-cooldown голоса.OLD_REP_FILEdata/reputation.json.extract_legacy_users_for_migrationподдерживает несколько старых форматов.owner-onlyкоманда доступна только владельцу бота.queue rolesпосле переноса пользователи ставятся в очередь ролей.Ошибки и решения
Почему игрок не может оценить себя?
Это защита от накрутки. Команда сразу блокирует self-vote и не меняет очки.
Почему бот пишет “голос восстанавливается”?
Бизнес-cooldown одного голоса — 12 часов. Это хранится в vote_cooldowns по guild_id и voter_id.
Почему у разных игроков разный вес голоса?
Вес считается от очков голосующего: легенда влияет сильнее, отрицательный статус слабее.
Почему роль не выдалась?
Проверьте Manage Roles, позицию роли бота и role_id ранга. Если роль выше роли бота, worker пропустит выдачу.
Можно ли сделать свои ранги?
Да. На сайте меняются name, min, discount, color и role_id. После сохранения deploy_requested запускает пересинхронизацию.
Что будет с магазином?
Магазин может запросить get_discount(user_id, guild_id): положительное значение уменьшает цену, отрицательное работает как наценка.