Нагороди за голоси

Voting Check

Як нагороджувати гравців після успішного голосу за твій запис на JoinGameServers.

Шлях налаштування: Панель → Редагувати сервер → Нагороди за голоси (і Деталі Minecraft для Votifier).

01

Як це працює

  1. Гравець відкриває твоє посилання для голосування, ідеально з ?p=USERNAME, щоб форма була попередньо заповнена.

  2. Він надсилає голос. Ми застосовуємо кулдаун 24 години на IP (і на акаунт у системі). Якщо нагороди налаштовано, нікнейм / параметр обов'язковий.

  3. Ми сповіщаємо твої системи нагород: HTTP GET на URL postback і/або пакет Votifier на Minecraft-хост — з тим самим параметром і IP голосуючого.

  4. Ти видаєш нагороду. Помилки доставки з твого боку логуються тут, але не знімають голос.

Обери спосіб

HTTP Postback

Найкраще для сайтів, лаунчерів і ігор не Minecraft. Для Minecraft — опційна альтернатива Votifier (або доповнення, якщо також нагороджуєш на сайті).

  • Працює для кожної гри в цьому списку
  • Ти контролюєш очки, кулдауни, логи
  • Потрібен публічний HTTPS-ендпоінт
Postback PHP →
Найкраще для Minecraft

Minecraft Votifier

Рекомендовано для Minecraft. Найкраще для скринь, ключів і listener-плагінів у грі. Ми відкриваємо TCP-з'єднання до порту Votifier.

  • Лише записи Minecraft
  • Classic RSA або токен NuVotifier v2
  • Потрібен відкритий порт + allowlist у файрволі
Minecraft Votifier →

Для Minecraft спочатку використовуй Votifier. HTTP postback — опційно (або додатково). Кожен увімкнений канал працює незалежно після голосу.

Швидкий старт

  1. Увійди й відкрий панель.
  2. Відредагуй схвалений запис сервера.
  3. Вкажи URL postback і/або увімкни Votifier в Деталях Minecraft.
  4. Скопіюй посилання для мотиваційного голосування з форми редагування (закінчується на ?p=USERNAME).
  5. Розмісти це посилання на сайті або в Discord; замінюй USERNAME для кожного гравця.
  6. Віддай тестовий голос і переконайся, що нагорода приходить.
02

Postback PHP

Після успішного голосу ми запитуємо твій URL із параметром гравця та його IP. Твій скрипт позначає акаунт як такого, що проголосував, і видає очки або предмети.

Додай публічну вихідну IP цього сайту в allowlist файрвола й скрипта postback. Відхиляй усі інші джерела. Краще HTTPS.

1. Вкажи URL postback

Панель → Редагувати сервер → Нагороди за голоси → URL postback.

https://YOURDOMAIN/postback.php
  • Назва файлу довільна — використай шлях, зручний для твого стеку.
  • Приймаються лише публічні URL http/https. Localhost, приватні LAN IP і URL з обліковими даними відхиляються (захист від SSRF).
  • Ми йдемо за невеликою кількістю редиректів і обриваємо запит через кілька секунд, щоб голосування лишалося швидким.

2. Збери посилання для мотиваційного голосування

Додай параметр, щоб кожного гравця було видно, коли він потрапляє на сторінку голосування.

/GAME/server/SLUG/vote?p=PARAMETER
Елемент Правила
PARAMETER / p_resp Лише літери, цифри, _, - · макс. 32 символи · нікнейм, ID акаунта або будь-який ID, який ти відстежуєш
ip IPv4 або IPv6 голосуючого, як бачить цей список (з урахуванням проксі, якщо увімкнено)
Попереднє заповнення ?p= або ?username=

3. Що ми викликаємо після голосу

Лише після успіху. Якщо гравець не віддав валідний голос, запит не надсилаємо.

https://YOURDOMAIN/postback.php?p_resp=PARAMETER&ip=USERIP
Мотиваційне посилання Наш callback
/minecraft-server/server/your-server-slug/vote?p=1234 …/postback.php?p_resp=1234&ip=123.123.123.123
/minecraft-server/server/your-server-slug/vote?p=Razor …/postback.php?p_resp=Razor&ip=123.123.123.123

Коли ми б'ємо в твій postback з p_resp=Razor, гравець Razor проголосував. Значення ip — адреса, яку він використав у цьому списку.

Що має робити твій скрипт

  • Перевір, що запит іде з публічної IP цього списку.
  • Очисти p_resp і ip (ніколи не довіряй сирому вводу).
  • Підтверди, що акаунт / персонаж існує в твоїй базі.
  • Застосуй власний кулдаун нагород, якщо потрібен жорсткіший за 24 години.
  • Видай очки, монети чи предмети; залоговай подію; поверни HTTP 200.

Приклад postback.php

Хости це на своєму сайті нагород, не обов'язково на цьому списку голосів. Перед продом задай VOTE_LIST_IP на вихідну публічну IP цього сайту.

<?php
/**
 * Example vote postback receiver for YOUR game website / CMS.
 *
 * Configure this URL on your listing under Dashboard → Edit server → Vote Rewards.
 * This list will call it ONLY after a successful vote:
 *
 *   https://yoursite.com/postback.php?p_resp=PARAMETER&ip=USERIP
 *
 * PARAMETER is the username / account id the player entered on the vote form
 * (or the value from ?p= on your incentive voting link).
 *
 * Docs: /voting-check
 */

define('DEBUG', 0); // set to 1 to write _postback.log
define('LOG_FILE', __DIR__ . '/_postback.log');

/**
 * Only accept callbacks from the vote list's public IP.
 * Leave empty to skip the allowlist (not recommended in production).
 *
 * Example: define('VOTE_LIST_IP', '203.0.113.10');
 */
define('VOTE_LIST_IP', '');

$ipRequest = $_SERVER['HTTP_CF_CONNECTING_IP']
    ?? (isset($_SERVER['HTTP_X_FORWARDED_FOR'])
        ? trim(explode(',', (string) $_SERVER['HTTP_X_FORWARDED_FOR'])[0])
        : null)
    ?? $_SERVER['REMOTE_ADDR']
    ?? '';
$ipRequest = trim((string) $ipRequest);

if (VOTE_LIST_IP !== '' && $ipRequest !== VOTE_LIST_IP) {
    if (DEBUG) {
        error_log(date('[Y-m-d H:i] ') . "[Invalid] Request from {$ipRequest}" . PHP_EOL, 3, LOG_FILE);
    }
    http_response_code(403);
    exit('Forbidden');
}

if (DEBUG) {
    error_log(date('[Y-m-d H:i] ') . "[OK] Valid callback: {$ipRequest}" . PHP_EOL, 3, LOG_FILE);
}

// Clean parameters from the vote list (letters, numbers, underscore, hyphen).
$p = preg_replace('/[^A-Za-z0-9_\-]+/', '', (string) ($_GET['p_resp'] ?? '')) ?? '';
$userIp = preg_replace('/[^0-9a-fA-F:\.]+/', '', (string) ($_GET['ip'] ?? '')) ?? '';

if ($p === '') {
    http_response_code(400);
    exit('Missing p_resp');
}

if (DEBUG) {
    error_log(date('[Y-m-d H:i] ') . "[GET] Parameters [p_resp]={$p} [ip]={$userIp}" . PHP_EOL, 3, LOG_FILE);
}

// ---------------------------------------------------------------------------
// Connect to your database, verify account $p exists, enforce your own
// cooldown if needed, then grant vote points / items to $p (voted from $userIp).
// We send p_resp + ip ONLY when that player successfully voted on the list.
// ---------------------------------------------------------------------------

http_response_code(200);
echo 'OK';
03

Minecraft Votifier

Ми можемо надіслати голос прямо на твій Minecraft-сервер. Listener-плагін тоді виконає твої команди нагород.

Файрвол: дозволь вхідний TCP з публічної IP цього сайту на порт Votifier (за замовчуванням 8192). Не відкривай порт на весь інтернет, якщо можеш цього уникнути.

  1. Гравець вводить нік Minecraft на нашій сторінці голосування (або заходить через ?p=Steve).

  2. Голос успішно зараховується в цьому списку.

  3. Ми підключаємося до хоста/порту Votifier і доставляємо пакет голосу.

  4. Твій listener видає скрині, ключі, гроші тощо.

Увімкни Votifier у Деталях Minecraft, обери NuVotifier v2 або Classic, тоді вкажи хост, порт і токен або публічний ключ RSA.

Встанови NuVotifier (classic RSA і протокол v2) або classic Votifier, плюс listener під твою версію Minecraft (GAListener, SuperbVote або власний listener).

Classic / v1: встав повний файл public.key. Хост і порт — у config.yml. Залиш debug: true, поки підключаєш цей список, потім вимкни.

host: YOUR_PUBLIC_IP
port: 8192
debug: true

Пакети ідентифікують цей список як: JoinGameServers

04

NuVotifier v2

Протокол v2 замінює RSA спільним токеном і одноразовим challenge. Прив'яжи токен до імені сервісу цього списку або використай токен за замовчуванням.

tokens:
  default: REPLACE_WITH_DEFAULT_TOKEN
  "JoinGameServers": REPLACE_WITH_LIST_TOKEN

Формат: TCP connect → читання привітання VOTIFIER 2 <challenge> → JSON payload (username, serviceName, timestamp ms, address, challenge) → Base64(HMAC-SHA256(payload, token)) → magic 0x733A + length + JSON {signature, payload}. Очікуй {"status":"ok"}.

Симптом Ймовірна причина
Це не сервер NuVotifier v2 У привітанні немає challenge — використай Classic або онови NuVotifier і увімкни v2.
Недійсний підпис / невідомий сервіс Невірний токен або ім'я сервісу не прив'язане. Додай ім'я сервісу списку або використай default.
З'єднання не вдалося / timeout Невірний хост/порт, Votifier офлайн або файрвол блокує IP цього списку.
Немає відповіді Втручання проксі/плагіна; увімкни debug NuVotifier і спробуй ще раз.
05

Чекліст тестування

  1. Збережи налаштування запису без помилок валідації.
  2. Відкрий мотиваційне посилання — поле нікнейму має заповнитися з ?p=.
  3. Віддай один голос. Маєш побачити стан успіху. Другий голос протягом 24 годин має бути заблокований.
  4. Перевір postback: увімкни DEBUG у приймачі; підтверди, що приходять p_resp і ip.
  5. Перевір Votifier: з debug true консоль Minecraft має показати вхідний голос для твого ніку та імені сервісу цього списку.
  6. Підтверди нагороду в грі або на сайті. Якщо ні — лагодь listener; голос у списку все одно зараховується.

Спроби доставки записуються в vote_reward_logs (ok / fail / skipped). Невдалий callback ніколи не відкочує голос у цьому списку.

06

FAQ і усунення проблем

Ні. Гості можуть голосувати. Акаунти в системі мають ті самі правила кулдауну 24 години для захисту від зловживань.

Якщо ти налаштував URL postback або Votifier, нам потрібен параметр, щоб сказати, кого нагороджувати. Без нагород нікнейм лишається необов'язковим.

Так. Обидва запускаються після успішного голосу. Помилки незалежні.

Це має бути публічний URL http(s). Localhost, .local, приватні IP (напр. 10.*, 192.168.*) і URL з вбудованими обліковими даними блокуються.

Переконайся, що голос пройшов у цьому списку. Перевір логи postback або debug NuVotifier. Перевір allowlist файрвола й чи нікнейм збігається з акаунтом у грі. Кулдаун списку — 24 години; твій власний кулдаун нагород може відрізнятися.

Лише A–Z, a–z, 0–9, _ і -. Усе інше відкидається. Тримай параметри ≤ 32 символи.