Награди за гласуване

Voting Check

Как награждаваш играчите, след като успешно гласуват за обявата ти в JoinGameServers.

Път за настройка: Табло → Редактирай сървър → Награди за гласове (и Minecraft детайли за Votifier).

01

Как работи

  1. Играчът отваря връзката ти за глас, най-добре с ?p=USERNAME, за да се попълни предварително формата.

  2. Изпраща гласа. Налагаме 24-часов cooldown на IP (и на влязъл акаунт). Ако са настроени награди, потребителското име / параметърът са задължителни.

  3. Уведомяваме системите ти за награди: HTTP GET към postback URL и/или Votifier пакет към Minecraft хоста — със същия параметър и IP на гласувалия.

  4. Ти даваш наградата. Неуспехите при доставка от твоя страна се логват тук, но не премахват гласа.

Избери метод

HTTP Postback

Най-добър за уебсайтове, лаунчъри и игри извън Minecraft. За Minecraft е опционална алтернатива на Votifier (или допълнение, ако награждаваш и в уебсайт).

  • Работи за всяка игра в този списък
  • Ти контролираш точките, cooldown-ите и логването
  • Нужен е публичен HTTPS endpoint
Postback PHP →
Най-добро за Minecraft

Minecraft Votifier

Предпочитан за Minecraft. Най-добър за crates, ключове и listener плъгини в играта. Отваряме TCP връзка към Votifier порта ти.

  • Само за Minecraft обяви
  • Classic RSA или NuVotifier v2 токен
  • Нужен е отворен порт + firewall allowlist
Minecraft Votifier →

За Minecraft използвай първо Votifier. HTTP postback е по избор (или допълнителен). Всеки включен канал работи независимо след гласа.

Бърз старт

  1. Влез и отвори Таблото.
  2. Редактирай одобрената си обява.
  3. Задай Postback URL и/или включи Votifier в Minecraft детайли.
  4. Копирай връзката за стимулирано гласуване от формата (завършва с ?p=USERNAME).
  5. Сложи тази връзка в уебсайта или Discord; замени USERNAME за всеки играч.
  6. Дай тестов глас и потвърди, че наградите пристигат.
02

Postback PHP

След успешен глас заявяваме URL-а ти с параметъра на играча и неговото IP. Скриптът ти маркира акаунта като гласувал и дава точки или предмети.

Добави публичния изходящ IP на този сайт в firewall и postback скрипта. Отхвърляй всеки друг източник. Предпочитай HTTPS.

1. Задай Postback URL

Табло → Редактирай сървър → Награди за гласове → Postback URL.

https://YOURDOMAIN/postback.php
  • Името на файла е свободно — използвай път, който пасва на твоя стек.
  • Приемат се само публични http/https URL. Localhost, частни LAN IP и URL с credentials се отхвърлят (SSRF защита).
  • Следваме малък брой redirects и прекъсваме след няколко секунди, за да остане гласуването бързо.

2. Създай връзки за стимулирано гласуване

Добави параметър, за да се идентифицира всеки играч, когато стигне до страницата за глас.

/GAME/server/SLUG/vote?p=PARAMETER
Част Правила
PARAMETER / p_resp Само букви, цифри, _, - · макс. 32 символа · потребителско име, id на акаунт или друг id, който следиш
ip IPv4 или IPv6 на гласувалия, както го вижда този списък (с отчитане на proxy, когато е включено)
Query за предварително попълване ?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 (никога не се доверявай на суровия вход).
  • Потвърди, че акаунтът / персонажът съществува в базата ти.
  • Приложи собствен cooldown за награди, ако ти трябва нещо по-строго от 24 часа.
  • Дай точки, монети или предмети; логни събитието; върни HTTP 200.

Пример postback.php

Хоствай това на сайта за награди, не задължително на този vote списък. Задай 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 плъгин после изпълнява командите за награда.

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

  1. Играчът въвежда Minecraft потребителското си име на нашата страница за глас (или идва чрез ?p=Steve).

  2. Гласът е успешен в този списък.

  3. Свързваме се към Votifier хост/порт и доставяме пакета за глас.

  4. Listener-ът ти дава crates, ключове, пари и т.н.

Включи Votifier в Minecraft детайли, избери NuVotifier v2 или Classic, после въведи хост, порт и токен или RSA публичен ключ.

Инсталирай NuVotifier (classic RSA и protocol 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

Protocol v2 заменя RSA със споделен токен и еднократен challenge. Свържи токен с service името на този списък или използвай токена по подразбиране.

tokens:
  default: REPLACE_WITH_DEFAULT_TOKEN
  "JoinGameServers": REPLACE_WITH_LIST_TOKEN

Wire формат: TCP connect → четене на greeting 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 сървър Greeting-ът няма challenge — използвай Classic или надгради NuVotifier и включи v2.
Невалиден подпис / непознат service Грешен токен или service името не е мапнато. Добави service името на списъка или използвай default.
Неуспешна връзка / timeout Грешен хост/порт, Votifier е офлайн или firewall блокира IP-то на този списък.
Няма отговор Смущения от proxy/плъгин; включи NuVotifier debug и опитай отново.
05

Контролен списък за тест

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

Опитите за доставка се записват в vote_reward_logs (ok / fail / skipped). Неуспешен callback никога не връща гласа назад в този списък.

06

ЧЗВ и отстраняване на проблеми

Не. Гостите могат да гласуват. Влезлите акаунти споделят същите 24-часови cooldown правила срещу злоупотреби.

Ако си настроил postback URL или Votifier, ни трябва параметър, за да знаем кого да наградим. Без настроени награди потребителското име остава по избор.

Да. И двете се изпълняват след успешен глас. Неуспехите са независими.

Трябва да е публичен http(s) URL. Localhost, .local, частни IP (напр. 10.*, 192.168.*) и URL с вградени credentials се блокират.

Потвърди, че гласът е успешен в този списък. Провери postback логовете или NuVotifier debug изхода. Провери firewall allowlist и дали потребителското име съвпада с акаунт в играта. Cooldown в списъка е 24 часа; твоят собствен cooldown за награда може да е различен.

Само A–Z, a–z, 0–9, _ и -. Всичко друго се премахва. Дръж параметрите ≤ 32 символа.