Промокоды и рефералы (HelgaPromo)
HelgaPromo — свой плагин, исходники лежат в plugins-src/helgapromo. Он
показывает, откуда пришёл новый игрок (от друга или от блогера), и
награждает обе стороны. Ещё через него идут акции с промокодами и
одноразовые коды за опросы.
Виды кодов
| Вид | Код | Кто создаёт | Когда можно ввести |
|---|---|---|---|
| Реферальный | ник игрока | есть у каждого, кто заходил на сервер | первые 10 часов игры, один раз за всё время |
| Блогерский | любой, например HELGA_IVAN | админ | так же — вместо реферального |
| Акция | любой, например NEWYEAR | админ | в любое время, каждый код один раз |
| Одноразовый | случайные 10 символов из серии | админ, generate / give | пока серия действует; код срабатывает один раз, игрок получает награду серии один раз |
От кого пришёл игрок, записывается один раз: реферальный или
блогерский код, сменить нельзя. Регистр в кодах не важен; символы —
A-Z 0-9 _, длина от 3 до 16.
Как работает приглашение
- Новичок пишет
/promo <код>(или вводит код через меню/ref) в первыеentry-window-hoursчасов игры и сразу получает наградуinvitee. - Приглашение засчитывается, когда новичок наиграет
confirm-hours(3 часа). Тогда наградуinviterполучает пригласивший — если он не в сети, то при следующем входе. - Чем больше засчитанных приглашений у кода, тем выше его уровень и
тем больше награды обеим сторонам (
levels.yml).
Защита от твинков. Через AuthMe сравниваются IP регистрации и
последнего входа новичка с другими аккаунтами и с владельцем кода. При
совпадении (authme.strict: false, по умолчанию) код принимается,
новичок награду получает, а приглашение помечается «на проверке» и
само не засчитывается. Решение принимает админ (suspicious,
approve, reject). При strict: true такой код просто не
принимается.
Если сервер стоит за прокси, который не передаёт реальные IP, проверка фактически не работает: локальные адреса пропускаются.
Игрокам
| Команда | Что делает |
|---|---|
/promo <код> | ввести код |
/ref | меню «Пригласи друга»: свой код, уровень и прогресс, лесенка наград, приглашённые, топ, ввод кода |
/ref top | топ-10 в чат |
Право helgapromo.use — у всех по умолчанию. В /menu HelgaShop
кнопка ставится строчкой в plugins/HelgaShop/menu.yml с
command: ref (см. «Главное меню /help»).
Админу
/promoadmin — право helgapromo.admin, по умолчанию у OP. Коды и
ники дополняются по Tab.
| Задача | Команды |
|---|---|
| Код блогеру | /promoadmin create blogger HELGA_IVAN Ivan --level max (ник и уровень необязательны; без владельца код только считает приглашённых) |
| Акция | /promoadmin create promo NEWYEAR --uses 100 --expires 2027-01-10, затем /promoadmin addcmd NEWYEAR eco give {player} 1000 |
| Одноразовые коды | /promoadmin create onetime OPROS, /promoadmin addcmd OPROS eco give {player} 500, затем /promoadmin generate OPROS 200 или /promoadmin give OPROS Ник |
| Награды кода | addcmd <код> <команда>, delcmd <код> <номер>, cmds <код> |
| Уровень и владелец | setlevel <код|ник> <N|max|auto>, setowner <код> <ник|none> |
| Включить, выключить, удалить | enable, disable, delete <код> — история приглашений после удаления остаётся |
| Статистика | stats <код>, list <код> [страница] — приглашённые |
| Откуда пришёл игрок | who <ник> |
| Подозрительные | suspicious, затем approve <ник> или reject <ник> |
| Перечитать конфиги | reload |
--level max закрепляет последний уровень лесенки: если позже добавить
новые уровни, код получит их сам.
Одноразовые коды нужны для наград за опрос и подобного — такой код
бесполезно пересылать друзьям. Имя серии (OPROS) само не вводится.
generate пишет коды в файл
plugins/HelgaPromo/codes/OPROS-<дата>.txt, по одному на человека;
give присылает код игроку в чат, удобно из консоли или другого
плагина. Сколько кодов уже активировано — stats OPROS. Удаление
серии удаляет и все её коды.
В наградах — обычные консольные команды других плагинов (eco,
crazycrates …). Подстановки: {player} — новичок или тот, кто
вводит акцию, {inviter} — пригласивший, {code}, {level}. Если
команда упала, остальные всё равно выполняются, ошибка пишется в лог.
Файлы
Всё в plugins/HelgaPromo/, после правки — /promoadmin reload.
| Файл | Что в нём |
|---|---|
config.yml | окно ввода (entry-window-hours: 10), порог засчитывания (confirm-hours: 3), топ, authme.strict |
levels.yml | лесенка уровней: need, награды invitee / inviter, тексты display-* для меню |
promos.yml | акции и серии одноразовых кодов (one-time: true) — можно задавать здесь вместо команд |
menu.yml, messages.yml | меню /ref и все тексты |
promo.db | база SQLite — в бэкап |
Сейчас уровни такие: 1 (с нуля), 2 (5 засчитанных), 3 (15), 4 (40). У
первого уровня need должен быть 0, дальше по возрастанию — иначе
плагин оставит прежнюю лесенку и напишет ошибку в лог.
Плейсхолдеры
| Плейсхолдер | Что выводит |
|---|---|
%helgapromo_top_<1-10>_name% | ник на месте, для блогерского кода без владельца — сам код; пустое место — --- |
%helgapromo_top_<1-10>_count% | засчитанных |
%helgapromo_top_<1-10>_level% | уровень |
%helgapromo_count%, %helgapromo_pending% | засчитано и ждут у игрока |
%helgapromo_level%, %helgapromo_next% | уровень и сколько осталось до следующего (max на последнем) |
%helgapromo_source% | по какому коду пришёл игрок, или - |
Топ пересчитывается раз в минуту. Строка голограммы в
DecentHolograms: &e1. %helgapromo_top_1_name% &7— &a%helgapromo_top_1_count%.
Выкладка
Сборка и установка — в README.md репозитория: mvn clean package →
target/HelgaPromo-1.0.0.jar, для сборки нужен AuthMe API в локальном
Maven. Работает без AuthMe и PlaceholderAPI, но тогда без проверки
твинков и без плейсхолдеров.