Odměny za hlasování

Voting Check

Jak odměňovat hráče poté, co úspěšně zahlasují na tvůj záznam na JoinGameServers.

Cesta nastavení: Panel → Upravit server → Odměny za vote (a Detaily Minecraft pro Votifier).

01

Jak to funguje

  1. Hráč otevře tvůj odkaz na hlasování, ideálně s ?p=USERNAME, aby byl formulář předvyplněný.

  2. Odešle hlas. Uplatňujeme 24hodinový cooldown na IP (a na přihlášený účet). Pokud jsou odměny nastavené, nick / parametr je povinný.

  3. Upozorníme tvoje systémy odměn: HTTP GET na postback URL a/nebo Votifier paket na Minecraft host — se stejným parametrem a IP hlasujícího.

  4. Ty udělíš odměnu. Selhání doručení na tvé straně se logují tady, ale hlas neodstraní.

Vyber metodu

HTTP Postback

Nejlepší pro weby, launchery a hry mimo Minecraft. U Minecraftu je to volitelná alternativa k Votifier (nebo doplněk, pokud odměňuješ i na webu).

  • Funguje pro každou hru na tomto seznamu
  • Ty řídíš body, cooldowny a logy
  • Vyžaduje veřejný HTTPS endpoint
Postback PHP →
Nejlepší pro Minecraft

Minecraft Votifier

Preferované pro Minecraft. Ideální pro crate, klíče a listener pluginy. Otevřeme TCP spojení na tvůj Votifier port.

  • Jen záznamy Minecraft
  • Classic RSA nebo NuVotifier v2 token
  • Vyžaduje otevřený port + allowlist ve firewallu
Minecraft Votifier →

U Minecraftu nejdřív Votifier. HTTP postback je volitelný (nebo dodatečný). Každý zapnutý kanál běží po hlasu nezávisle.

Rychlý start

  1. Přihlas se a otevři panel.
  2. Uprav schválený záznam serveru.
  3. Nastav Postback URL a/nebo zapni Votifier v Detaily Minecraft.
  4. Zkopíruj incentive odkaz z editačního formuláře (končí na ?p=USERNAME).
  5. Umísti odkaz na web nebo Discord; za každého hráče nahraď USERNAME.
  6. Dej testovací hlas a ověř, že odměna dorazila.
02

Postback PHP

Po úspěšném hlasu zavoláme tvou URL s parametrem hráče a jeho IP. Tvůj skript označí účet jako hlasující a udělí body nebo itemy.

Přidej veřejnou odchozí IP tohoto webu na whitelist ve firewallu a postback skriptu. Ostatní zdroje odmítni. Preferuj HTTPS.

1. Nastav Postback URL

Panel → Upravit server → Odměny za vote → Postback URL.

https://YOURDOMAIN/postback.php
  • Název souboru je libovolný — použij cestu, která sedí tvému stacku.
  • Přijímáme jen veřejné http/https URL. Localhost, privátní LAN IP a URL s přihlašovacími údaji jsou odmítnuté (ochrana SSRF).
  • Sledujeme jen malý počet redirectů a po pár sekundách končíme, aby hlasování zůstalo rychlé.

2. Sestav incentive odkazy na hlasování

Přidej parametr, aby byl každý hráč rozpoznaný po vstupu na stránku hlasování.

/GAME/server/SLUG/vote?p=PARAMETER
Část Pravidla
PARAMETER / p_resp Jen písmena, čísla, _, - · max. 32 znaků · nick, ID účtu nebo libovolné ID, které sleduješ
ip IPv4 nebo IPv6 hlasujícího, jak ho vidí tento seznam (s ohledem na proxy, pokud je zapnutá)
Předvyplnění ?p= nebo ?username=

3. Co voláme po hlasu

Jen při úspěchu. Pokud hráč neodevzdal platný hlas, žádost neodesíláme.

https://YOURDOMAIN/postback.php?p_resp=PARAMETER&ip=USERIP
Incentive odkaz Náš 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

Když trefíme tvůj postback s p_resp=Razor, hráč Razor zahlasoval. Hodnota ip je adresa, kterou použil na tomto seznamu.

Co by měl dělat tvůj skript

  • Ověř, že požadavek přichází z veřejné IP tohoto seznamu.
  • Vyčisti p_resp a ip (nikdy nevěř surovým datům).
  • Potvrď, že účet / postava existuje v tvé databázi.
  • Aplikuj vlastní cooldown odměn, pokud potřebuješ něco přísnějšího než 24 hodin.
  • Udělej body, mince nebo itemy; zaloguj událost; vrať HTTP 200.

Příklad postback.php

Hostuj to na webu s odměnami, ne nutně na tomto seznamu hlasů. Před spuštěním nastav VOTE_LIST_IP na odchozí veřejnou IP tohoto webu.

<?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

Hlas můžeme poslat rovnou na tvůj Minecraft server. Listener plugin pak spustí tvoje příkazy odměn.

Firewall: povol příchozí TCP z veřejné IP tohoto webu na Votifier port (výchozí 8192). Pokud můžeš, nevystavuj port na celý internet.

  1. Hráč zadá Minecraft nick na naší stránce hlasování (nebo přijde přes ?p=Steve).

  2. Hlas projde na tomto seznamu.

  3. Připojíme se k tvému Votifier hostu/portu a doručíme paket hlasu.

  4. Tvůj listener udělí crate, klíče, peníze atd.

Zapni Votifier v Detaily Minecraft, zvol NuVotifier v2 nebo Classic a pak zadej host, port a token nebo RSA veřejný klíč.

Nainstaluj NuVotifier (classic RSA a protokol v2) nebo classic Votifier plus listener pro tvoji verzi Minecraftu (GAListener, SuperbVote nebo vlastní listener).

Classic / v1: vlož celý soubor public.key. Host a port jsou v config.yml. Při napojování na tento seznam nech debug: true, pak to vypni.

host: YOUR_PUBLIC_IP
port: 8192
debug: true

Pakety identifikují tento seznam jako: JoinGameServers

04

NuVotifier v2

Protokol v2 nahrazuje RSA sdíleným tokenem a jednorázovým challenge. Namapuj token na service name tohoto seznamu, nebo použij výchozí token.

tokens:
  default: REPLACE_WITH_DEFAULT_TOKEN
  "JoinGameServers": REPLACE_WITH_LIST_TOKEN

Wire formát: TCP connect → přečti greeting VOTIFIER 2 <challenge> → JSON payload (username, serviceName, timestamp ms, address, challenge) → Base64(HMAC-SHA256(payload, token)) → magic 0x733A + délka + JSON {signature, payload}. Očekávej {"status":"ok"}.

Příznak Pravděpodobná příčina
To není NuVotifier v2 server Greeting nemá challenge — použij Classic, nebo aktualizuj NuVotifier a zapni v2.
Neplatný podpis / neznámá služba Špatný token, nebo service name není namapovaný. Přidej service name seznamu, nebo použij výchozí.
Připojení selhalo / timeout Špatný host/port, Votifier offline, nebo firewall blokuje IP tohoto seznamu.
Žádná odpověď Interference proxy/pluginu; zapni NuVotifier debug a zkus to znovu.
05

Kontrolní seznam testů

  1. Ulož nastavení záznamu bez chyb validace.
  2. Otevři incentive odkaz — pole nicku by se mělo předvyplnit z ?p=.
  3. Dej jeden hlas. Měl bys vidět úspěšný stav. Druhý hlas do 24 hodin musí být zablokovaný.
  4. Ověř postback: zapni DEBUG v přijímači; potvrď, že dorazí p_resp a ip.
  5. Ověř Votifier: při debug true by Minecraft konzole měla ukázat příchozí hlas pro tvůj nick a service name tohoto seznamu.
  6. Potvrď odměnu ve hře nebo na webu. Pokud ne, oprav listener — hlas na seznamu se stejně počítá.

Pokusy o doručení se zapisují do vote_reward_logs (ok / fail / skipped). Neúspěšný callback nikdy nevrací hlas na tomto seznamu.

06

FAQ a řešení problémů

Ne. Hosté můžou hlasovat. Přihlášené účty mají stejná pravidla 24hodinového cooldownu kvůli ochraně před zneužitím.

Pokud jsi nastavil postback URL nebo Votifier, potřebujeme parametr, abychom věděli, koho odměnit. Bez nastavených odměn zůstává nick volitelný.

Ano. Oba běží po úspěšném hlasu. Selhání jsou nezávislá.

Musí to být veřejná http(s) URL. Localhost, .local, privátní IP (např. 10.*, 192.168.*) a URL s přihlašovacími údaji jsou blokované.

Potvrď, že hlas prošel na tomto seznamu. Zkontroluj logy postbacku nebo NuVotifier debug výstup. Ověř allowlist ve firewallu a že nick sedí na herní účet. Cooldown seznamu je 24 hodin; vlastní cooldown odměn může být jiný.

Jen A–Z, a–z, 0–9, _ a -. Všechno ostatní se ořízne. Parametry drž ≤ 32 znaků.