Recompense vot

Voting Check

Cum recompensezi jucătorii după ce votează cu succes pentru listing-ul tău pe JoinGameServers.

Cale de setup: Dashboard → Editează serverul → Recompense vote (și Detalii Minecraft pentru Votifier).

01

Cum funcționează

  1. Jucătorul deschide linkul tău de vote, ideal cu ?p=USERNAME ca formularul să fie precompletat.

  2. Trimite vote-ul. Aplicăm un cooldown de 24 de ore pe IP (și pe contul autentificat). Dacă recompensele sunt configurate, username-ul / parametrul e obligatoriu.

  3. Notificăm sistemele tale de recompense: HTTP GET către URL-ul de postback și/sau un pachet Votifier către hostul Minecraft — cu același parametru și IP-ul votantului.

  4. Tu acorzi recompensa. Eșecurile de livrare pe partea ta sunt logate aici, dar nu șterg vote-ul.

Alege o metodă

HTTP Postback

Cel mai bun pentru website-uri, launcher-e și jocuri non-Minecraft. Pentru Minecraft e o alternativă opțională la Votifier (sau un plus dacă recompensezi și pe website).

  • Funcționează pentru orice joc de pe listă
  • Tu controlezi punctele, cooldown-urile, logging-ul
  • Ai nevoie de un endpoint public HTTPS
Postback PHP →
Ideal pentru Minecraft

Minecraft Votifier

Preferat pentru Minecraft. Ideal pentru crate-uri, key-uri și plugin-uri listener in-game. Deschidem o conexiune TCP către portul tău Votifier.

  • Doar listing-uri Minecraft
  • Classic RSA sau token NuVotifier v2
  • Ai nevoie de un port deschis + allowlist pe firewall
Minecraft Votifier →

Pentru Minecraft, începe cu Votifier. HTTP postback e opțional (sau în plus). Fiecare canal activat rulează independent după vote.

Start rapid

  1. Autentifică-te și deschide Dashboard.
  2. Editează listing-ul serverului aprobat.
  3. Setează un URL de Postback și/sau activează Votifier la Detalii Minecraft.
  4. Copiază linkul de vote cu incentive din formularul de editare (se termină cu ?p=USERNAME).
  5. Pune linkul pe website sau Discord; înlocuiește USERNAME pentru fiecare jucător.
  6. Dă un vote de test și confirmă că recompensele ajung.
02

Postback PHP

După un vote reușit apelăm URL-ul tău cu parametrul jucătorului și IP-ul lui. Scriptul tău marchează contul ca a votat și acordă puncte sau iteme.

Pune pe whitelist IP-ul public outbound al acestui website în firewall și în scriptul de postback. Respinge orice altă sursă. Preferă HTTPS.

1. Setează URL-ul de Postback

Dashboard → Editează serverul → Recompense vote → URL postback.

https://YOURDOMAIN/postback.php
  • Numele fișierului e arbitrar — folosește orice path preferă stack-ul tău.
  • Se acceptă doar URL-uri publice http/https. Localhost, IP-uri LAN private și credențiale în URL sunt respinse (protecție SSRF).
  • Urmărim un număr mic de redirect-uri și expirăm după câteva secunde, ca vote-ul să rămână rapid.

2. Construiește linkuri de vote cu incentive

Adaugă un parametru ca fiecare jucător să fie identificat când ajunge pe pagina de vote.

/GAME/server/SLUG/vote?p=PARAMETER
Piesă Reguli
PARAMETER / p_resp Doar litere, cifre, _, - · max 32 caractere · username, id de cont sau orice id pe care îl urmărești
ip IPv4 sau IPv6 al votantului, așa cum e văzut de această listă (proxy-aware când e activat)
Query de precompletare ?p= sau ?username=

3. Ce apelăm după un vote

Doar la succes. Dacă jucătorul nu a finalizat un vote valid, nu trimitem nicio cerere.

https://YOURDOMAIN/postback.php?p_resp=PARAMETER&ip=USERIP
Link cu incentive Callback-ul nostru
/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

Când lovim postback-ul tău cu p_resp=Razor, jucătorul Razor a votat. Valoarea ip e adresa folosită pe această listă.

Ce ar trebui să facă scriptul tău

  • Verifică că cererea vine de pe IP-ul public al acestei liste.
  • Sanitizează p_resp și ip (nu avea încredere în input brut).
  • Confirmă că contul / personajul există în baza ta de date.
  • Aplică propriul cooldown de recompensă dacă ai nevoie de ceva mai strict decât 24 de ore.
  • Acordă puncte, monede sau iteme; loghează evenimentul; returnează HTTP 200.

Exemplu postback.php

Hostează asta pe site-ul tău de recompense, nu neapărat pe această listă de vote. Setează VOTE_LIST_IP pe IP-ul public outbound al acestui website înainte să treci live.

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

Putem împinge vote-ul direct pe serverul tău Minecraft. Un plugin listener rulează apoi comenzile de recompensă.

Firewall: permite TCP inbound de pe IP-ul public al acestui website către portul tău Votifier (implicit 8192). Nu expune portul pe tot internetul dacă poți evita.

  1. Jucătorul introduce username-ul Minecraft pe pagina noastră de vote (sau ajunge via ?p=Steve).

  2. Vote-ul reușește pe această listă.

  3. Ne conectăm la hostul/portul Votifier și livrăm pachetul de vote.

  4. Listener-ul tău acordă crate-uri, key-uri, bani etc.

Activează Votifier la Detalii Minecraft, alege NuVotifier v2 sau Classic, apoi introdu host, port și token sau cheia publică RSA.

Instalează NuVotifier (classic RSA și protocol v2) sau classic Votifier, plus un listener pentru versiunea ta de Minecraft (GAListener, SuperbVote sau un listener custom).

Classic / v1: lipește fișierul public.key complet. Hostul și portul vin din config.yml. Ține debug: true cât timp conectezi această listă, apoi oprește-l.

host: YOUR_PUBLIC_IP
port: 8192
debug: true

Pachetele identifică această listă ca: JoinGameServers

04

NuVotifier v2

Protocolul v2 înlocuiește RSA cu un token partajat și un challenge one-time. Mapează un token pe numele de service al acestei liste sau folosește token-ul default.

tokens:
  default: REPLACE_WITH_DEFAULT_TOKEN
  "JoinGameServers": REPLACE_WITH_LIST_TOKEN

Format pe fir: TCP connect → citește greeting VOTIFIER 2 <challenge> → payload JSON (username, serviceName, timestamp ms, address, challenge) → Base64(HMAC-SHA256(payload, token)) → magic 0x733A + length + JSON {signature, payload}. Așteaptă {"status":"ok"}.

Simptom Cauză probabilă
Nu e un server NuVotifier v2 Greeting-ul nu are challenge — folosește Classic sau upgrade NuVotifier și activează v2.
Semnătură invalidă / service necunoscut Token greșit sau numele de service nu e mapat. Adaugă numele de service al listei sau folosește default.
Conexiune eșuată / timeout Host/port greșit, Votifier offline sau firewall care blochează IP-ul acestei liste.
Niciun răspuns Interferență proxy/plugin; activează debug NuVotifier și încearcă din nou.
05

Checklist de testare

  1. Salvează setările listing-ului fără erori de validare.
  2. Deschide un link cu incentive — câmpul username ar trebui să se precompleteze din ?p=.
  3. Dă un vote. Ar trebui să vezi starea de succes. Un al doilea vote în 24 de ore trebuie blocat.
  4. Verifică postback: activează DEBUG în receiver; confirmă că p_resp și ip ajung.
  5. Verifică Votifier: cu debug true, consola Minecraft ar trebui să arate un vote incoming pentru username-ul tău și numele de service al acestei liste.
  6. Confirmă recompensa in-game sau pe site. Dacă nu vine, repară listener-ul — vote-ul pe listă tot contează.

Încercările de livrare sunt înregistrate în vote_reward_logs (ok / fail / skipped). Un callback eșuat nu anulează niciodată vote-ul pe această listă.

06

FAQ & troubleshooting

Nu. Guest-urile pot vota. Conturile autentificate împart aceleași reguli de cooldown de 24 de ore, ca să prevenim abuzul.

Dacă ai configurat un URL de postback sau Votifier, avem nevoie de un parametru ca să știm pe cine să recompensezi. Fără recompense configurate, username-ul rămâne opțional.

Da. Ambele rulează după un vote reușit. Eșecurile sunt independente.

Trebuie să fie un URL public http(s). Localhost, .local, IP-uri private (ex. 10.*, 192.168.*) și URL-urile cu credențiale încorporate sunt blocate.

Confirmă că vote-ul a reușit pe această listă. Verifică logurile de postback sau output-ul de debug NuVotifier. Verifică allowlist-urile pe firewall și că username-ul se potrivește cu un cont in-game. Cooldown-ul listei e de 24 de ore; cooldown-ul tău de recompensă poate diferi.

Doar A–Z, a–z, 0–9, _ și -. Orice altceva e eliminat. Ține parametrii ≤ 32 caractere.