Nagrody za głosy

Voting Check

Jak nagradzać graczy po udanym głosie na twój wpis w JoinGameServers.

Ścieżka konfiguracji: Panel → Edytuj serwer → Nagrody za głosy (oraz Szczegóły Minecraft dla Votifier).

01

Jak to działa

  1. Gracz otwiera twój link do głosowania, najlepiej z ?p=USERNAME, żeby formularz był wstępnie wypełniony.

  2. Wysyła głos. Stosujemy 24-godzinny cooldown na IP (i na zalogowane konto). Jeśli nagrody są skonfigurowane, nick / parametr jest wymagany.

  3. Powiadamiamy twoje systemy nagród: HTTP GET na URL postback i/lub pakiet Votifier na host Minecraft — z tym samym parametrem i IP głosującego.

  4. Przyznajesz nagrodę. Błędy dostawy po twojej stronie są logowane tutaj, ale nie usuwają głosu.

Wybierz metodę

HTTP Postback

Najlepsze dla stron, launcherów i gier innych niż Minecraft. Dla Minecraft to opcjonalna alternatywa dla Votifier (albo dodatek, jeśli nagradzasz też na stronie).

  • Działa dla każdej gry na tej liście
  • Ty kontrolujesz punkty, cooldowny i logi
  • Wymaga publicznego endpointu HTTPS
Postback PHP →
Najlepsze dla Minecraft

Minecraft Votifier

Preferowane dla Minecraft. Najlepsze do skrzynek, kluczy i pluginów listener. Otwieramy połączenie TCP na port Votifier.

  • Tylko wpisy Minecraft
  • Classic RSA lub token NuVotifier v2
  • Wymaga otwartego portu i allowlisty w firewallu
Minecraft Votifier →

Dla Minecraft najpierw Votifier. HTTP postback jest opcjonalny (albo dodatkowy). Każdy włączony kanał działa niezależnie po głosie.

Szybki start

  1. Zaloguj się i otwórz panel.
  2. Edytuj zatwierdzony wpis serwera.
  3. Ustaw URL postback i/lub włącz Votifier w Szczegółach Minecraft.
  4. Skopiuj link zachęcający do głosowania z formularza edycji (kończy się na ?p=USERNAME).
  5. Umieść ten link na stronie lub Discordzie; zamień USERNAME dla każdego gracza.
  6. Oddaj testowy głos i potwierdź, że nagroda dotarła.
02

Postback PHP

Po udanym głosie odpytujemy twój URL z parametrem gracza i jego IP. Twój skrypt oznacza konto jako głosujące i przyznaje punkty lub przedmioty.

Dodaj publiczne wychodzące IP tej strony do allowlisty w firewallu i skrypcie postback. Odrzucaj wszystkie inne źródła. Preferuj HTTPS.

1. Ustaw URL postback

Panel → Edytuj serwer → Nagrody za głosy → URL postback.

https://YOURDOMAIN/postback.php
  • Nazwa pliku jest dowolna — użyj ścieżki, która pasuje do twojego stacku.
  • Akceptujemy tylko publiczne URL http/https. Localhost, prywatne IP w LAN i URL z danymi logowania są odrzucane (ochrona SSRF).
  • Podążamy za niewielką liczbą przekierowań i kończymy po kilku sekundach, żeby głosowanie było szybkie.

2. Buduj linki zachęcające do głosowania

Dodaj parametr, żeby każdy gracz był rozpoznany po wejściu na stronę głosowania.

/GAME/server/SLUG/vote?p=PARAMETER
Element Zasady
PARAMETER / p_resp Tylko litery, cyfry, _, - · maks. 32 znaki · nick, ID konta lub dowolne ID, które śledzisz
ip IPv4 lub IPv6 głosującego, jak widzi to lista (z uwzględnieniem proxy, gdy włączone)
Wstępne wypełnienie ?p= lub ?username=

3. Co wywołujemy po głosie

Tylko po sukcesie. Jeśli gracz nie oddał prawidłowego głosu, nie wysyłamy żądania.

https://YOURDOMAIN/postback.php?p_resp=PARAMETER&ip=USERIP
Link zachęcający Nasz 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

Gdy trafiamy na twój postback z p_resp=Razor, gracz Razor zagłosował. Wartość ip to adres, którego użył na tej liście.

Co powinien robić twój skrypt

  • Zweryfikuj, że żądanie pochodzi z publicznego IP tej listy.
  • Oczyść p_resp i ip (nigdy nie ufaj surowym danym).
  • Potwierdź, że konto / postać istnieje w twojej bazie.
  • Zastosuj własny cooldown nagród, jeśli potrzebujesz czegoś ostrzejszego niż 24 godziny.
  • Przyznaj punkty, monety lub przedmioty; zaloguj zdarzenie; zwróć HTTP 200.

Przykład postback.php

Hostuj to na swojej stronie z nagrodami, niekoniecznie na tej liście głosów. Ustaw VOTE_LIST_IP na wychodzące publiczne IP tej strony przed startem produkcyjnym.

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

Możemy wysłać głos prosto na twój serwer Minecraft. Plugin listener uruchamia wtedy twoje komendy nagród.

Firewall: zezwól na przychodzące TCP z publicznego IP tej strony na port Votifier (domyślnie 8192). Nie wystawiaj portu na cały internet, jeśli możesz tego uniknąć.

  1. Gracz wpisuje nick Minecraft na naszej stronie głosowania (albo wchodzi przez ?p=Steve).

  2. Głos przechodzi na tej liście.

  3. Łączymy się z hostem/portem Votifier i dostarczamy pakiet głosu.

  4. Twój listener przyznaje skrzynki, klucze, kasę itd.

Włącz Votifier w Szczegółach Minecraft, wybierz NuVotifier v2 lub Classic, a potem podaj host, port i token lub klucz publiczny RSA.

Zainstaluj NuVotifier (classic RSA i protokół v2) lub classic Votifier, plus listener do twojej wersji Minecraft (GAListener, SuperbVote lub własny listener).

Classic / v1: wklej cały plik public.key. Host i port są w config.yml. Zostaw debug: true podczas łączenia z tą listą, potem wyłącz.

host: YOUR_PUBLIC_IP
port: 8192
debug: true

Pakiety identyfikują tę listę jako: JoinGameServers

04

NuVotifier v2

Protokół v2 zastępuje RSA współdzielonym tokenem i jednorazowym challenge. Przypisz token do nazwy usługi tej listy albo użyj domyślnego tokena.

tokens:
  default: REPLACE_WITH_DEFAULT_TOKEN
  "JoinGameServers": REPLACE_WITH_LIST_TOKEN

Format: TCP connect → odczyt powitania VOTIFIER 2 <challenge> → payload JSON (username, serviceName, timestamp ms, address, challenge) → Base64(HMAC-SHA256(payload, token)) → magic 0x733A + długość + JSON {signature, payload}. Oczekuj {"status":"ok"}.

Objaw Prawdopodobna przyczyna
To nie serwer NuVotifier v2 Powitanie bez challenge — użyj Classic albo zaktualizuj NuVotifier i włącz v2.
Nieprawidłowy podpis / nieznana usługa Zły token albo nieprzypisana nazwa usługi. Dodaj nazwę usługi listy albo użyj domyślnego tokena.
Połączenie nieudane / timeout Zły host/port, Votifier offline albo firewall blokuje IP tej listy.
Brak odpowiedzi Interferencja proxy/pluginu; włącz debug NuVotifier i spróbuj ponownie.
05

Lista testów

  1. Zapisz ustawienia wpisu bez błędów walidacji.
  2. Otwórz link zachęcający — pole nicku powinno wypełnić się z ?p=.
  3. Oddaj jeden głos. Powinieneś zobaczyć stan sukcesu. Drugi głos w 24 godzinach musi być zablokowany.
  4. Zweryfikuj postback: włącz DEBUG w odbiorniku; potwierdź, że przychodzą p_resp i ip.
  5. Zweryfikuj Votifier: przy debug true konsola Minecraft powinna pokazać przychodzący głos dla twojego nicku i nazwy usługi tej listy.
  6. Potwierdź nagrodę w grze lub na stronie. Jeśli nie, napraw listener — głos na liście i tak się liczy.

Próby dostawy są zapisywane w vote_reward_logs (ok / fail / skipped). Nieudany callback nigdy nie cofa głosu na tej liście.

06

FAQ i rozwiązywanie problemów

Nie. Goście mogą głosować. Zalogowane konta mają te same zasady 24-godzinnego cooldownu dla ochrony przed nadużyciami.

Jeśli skonfigurowałeś URL postback lub Votifier, potrzebujemy parametru, żeby wiedzieć, kogo nagrodzić. Bez nagród nick pozostaje opcjonalny.

Tak. Oba uruchamiają się po udanym głosie. Błędy są niezależne.

Musi to być publiczny URL http(s). Localhost, .local, prywatne IP (np. 10.*, 192.168.*) i URL z danymi logowania są blokowane.

Potwierdź, że głos przeszedł na tej liście. Sprawdź logi postback lub output debug NuVotifier. Zweryfikuj allowlistę firewallu i czy nick pasuje do konta w grze. Cooldown listy to 24 godziny; twój własny cooldown nagród może być inny.

Tylko A–Z, a–z, 0–9, _ i -. Wszystko inne jest usuwane. Trzymaj parametry ≤ 32 znaki.