Stem beloningen

Voting Check

Hoe je spelers beloont na een succesvolle stem op je listing op JoinGameServers.

Instelpad: Dashboard → Server bewerken → Stembeloningen (en Minecraft-details voor Votifier).

01

Hoe het werkt

  1. Speler opent je stemlink, idealiter met ?p=USERNAME zodat het formulier vooraf ingevuld is.

  2. Ze dienen de stem in. We hanteren een 24-uurs cooldown per IP (en per ingelogd account). Als beloningen zijn ingesteld, is de gebruikersnaam / parameter verplicht.

  3. We melden je beloningssystemen: HTTP GET naar je postback-URL en/of een Votifier-pakket naar je Minecraft-host — met dezelfde parameter en het IP van de stemmer.

  4. Je geeft de beloning. Leveringsfouten aan jouw kant worden hier gelogd maar verwijderen de stem niet.

Kies een methode

HTTP Postback

Het beste voor websites, launchers en non-Minecraft games. Voor Minecraft is dit een optioneel alternatief voor Votifier (of een aanvulling als je ook op een website beloont).

  • Werkt voor elke game op deze lijst
  • Je bepaalt punten, cooldowns en logging
  • Vereist een openbaar HTTPS-endpoint
Postback PHP →
Beste voor Minecraft

Minecraft Votifier

Voorkeur voor Minecraft. Het beste voor in-game crates, keys en listener-plugins. We openen een TCP-verbinding naar je Votifier-port.

  • Alleen Minecraft-listings
  • Classic RSA of NuVotifier v2-token
  • Vereist een open port + firewall allowlist
Minecraft Votifier →

Voor Minecraft, gebruik eerst Votifier. HTTP postback is optioneel (of extra). Elk ingeschakeld kanaal werkt onafhankelijk na de stem.

Snel starten

  1. Log in en open Dashboard.
  2. Bewerk je goedgekeurde serverlisting.
  3. Stel een Postback-URL in en/of schakel Votifier in onder Minecraft-details.
  4. Kopieer de incentive stemlink uit het bewerkformulier (eindigt op ?p=USERNAME).
  5. Plaats die link op je website of Discord; vervang USERNAME per speler.
  6. Stem een teststem en bevestig dat beloningen aankomen.
02

Postback PHP

Na een succesvolle stem vragen we je URL met de spelerparameter en hun IP. Je script markeert dat account als gestemd en geeft punten of items.

Whitelist het openbare uitgaande IP van deze website in je firewall en postback-script. Weiger elke andere bron. Gebruik HTTPS waar mogelijk.

1. Stel je Postback-URL in

Dashboard → Server bewerken → Stembeloningen → Postback-URL.

https://YOURDOMAIN/postback.php
  • De bestandsnaam is vrij — gebruik elk pad dat je stack prefereert.
  • Alleen openbare http/https-URL's worden geaccepteerd. Localhost, private LAN-IP's en URL-credentials worden geweigerd (SSRF-bescherming).
  • We volgen een klein aantal redirects en time-out na een paar seconden zodat stemmen snel blijft.

2. Bouw incentive stemlinks

Voeg een parameter toe zodat elke speler geïdentificeerd wordt op de stempagina.

/GAME/server/SLUG/vote?p=PARAMETER
Onderdeel Regels
PARAMETER / p_resp Alleen letters, cijfers, _, - · max 32 tekens · gebruikersnaam, account-id of elke id die je volgt
ip IPv4 of IPv6 van de stemmer zoals gezien door deze lijst (proxy-aware indien ingeschakeld)
Prefill-query ?p= of ?username=

3. Wat we aanroepen na een stem

Alleen bij succes. Als de speler geen geldige stem heeft ingediend, sturen we geen request.

https://YOURDOMAIN/postback.php?p_resp=PARAMETER&ip=USERIP
Incentive-link Onze 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

Wanneer we je postback met p_resp=Razor aanroepen, heeft speler Razor gestemd. De ip-waarde is het adres dat ze op deze lijst gebruikten.

Wat je script moet doen

  • Verifieer dat de request van het openbare IP van deze lijst komt.
  • Sanitize p_resp en ip (vertrouw nooit ruwe input).
  • Bevestig dat het account / character in je database bestaat.
  • Pas je eigen beloningscooldown toe als je iets strenger nodig hebt dan 24 uur.
  • Geef punten, coins of items; log het event; return HTTP 200.

postback.php-voorbeeld

Host dit op je beloningssite, niet per se op deze stemlijst. Zet VOTE_LIST_IP op het uitgaande openbare IP van deze website voordat je live gaat.

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

We kunnen de stem direct naar je Minecraft-server pushen. Een listener-plugin voert dan je beloningscommando's uit.

Firewall: sta inbound TCP van het openbare IP van deze website naar je Votifier-port (standaard 8192). Exposeer de port niet aan het hele internet als je dat kunt vermijden.

  1. Speler voert zijn Minecraft-gebruikersnaam in op onze stempagina (of komt via ?p=Steve).

  2. Stem slaagt op deze lijst.

  3. We verbinden met je Votifier-host/port en leveren het stem-pakket.

  4. Je listener geeft crates, keys, geld, enz.

Schakel Votifier in onder Minecraft-details, kies NuVotifier v2 of Classic en voer host, port en token of RSA-publieke sleutel in.

Installeer NuVotifier (classic RSA en protocol v2) of classic Votifier, plus een listener voor je Minecraft-versie (GAListener, SuperbVote of een custom listener).

Classic / v1: plak het volledige public.key-bestand. Host en port komen uit config.yml. Houd debug: true aan tijdens het koppelen van deze lijst, daarna uitzetten.

host: YOUR_PUBLIC_IP
port: 8192
debug: true

Pakketten identificeren deze lijst als: JoinGameServers

04

NuVotifier v2

Protocol v2 vervangt RSA met een gedeeld token en een eenmalige challenge. Map een token naar de servicenaam van deze lijst of gebruik het standaardtoken.

tokens:
  default: REPLACE_WITH_DEFAULT_TOKEN
  "JoinGameServers": REPLACE_WITH_LIST_TOKEN

Wire format: TCP connect → read greeting VOTIFIER 2 <challenge> → JSON payload (username, serviceName, timestamp ms, address, challenge) → Base64(HMAC-SHA256(payload, token)) → magic 0x733A + length + JSON {signature, payload}. Expect {"status":"ok"}.

Symptoom Waarschijnlijke oorzaak
Geen NuVotifier v2-server Greeting heeft geen challenge — gebruik Classic of upgrade NuVotifier en schakel v2 in.
Ongeldige signature / onbekende service Verkeerd token of servicenaam niet gemapt. Voeg de lijst-servicenaam toe of gebruik standaard.
Connect mislukt / timeout Verkeerde host/port, Votifier offline of firewall blokkeert het IP van deze lijst.
Geen response Proxy/plugin-interferentie; schakel NuVotifier debug in en probeer opnieuw.
05

Testchecklist

  1. Sla listinginstellingen op zonder validatiefouten.
  2. Open een incentive-link — het gebruikersnaamveld moet vooraf ingevuld zijn via ?p=.
  3. Stem één keer. Je moet de successtatus zien. Een tweede stem binnen 24 uur moet geblokkeerd worden.
  4. Verifieer postback: schakel DEBUG in je receiver in; bevestig dat p_resp en ip aankomen.
  5. Verifieer Votifier: met debug true moet de Minecraft-console een inkomende stem voor je gebruikersnaam en de servicenaam van deze lijst tonen.
  6. Bevestig de in-game of site-beloning. Als niet, fix de listener — de lijststem telt nog steeds.

Leveringspogingen worden vastgelegd in vote_reward_logs (ok / fail / skipped). Een mislukte callback draait de stem nooit terug op deze lijst.

06

FAQ & troubleshooting

Nee. Gasten kunnen stemmen. Ingelogde accounts delen dezelfde 24-uurs cooldown-regels tegen misbruik.

Als je een postback-URL of Votifier hebt ingesteld, hebben we een parameter nodig om te weten wie te belonen. Zonder beloningen ingesteld blijft gebruikersnaam optioneel.

Ja. Beide draaien na een succesvolle stem. Fouten zijn onafhankelijk.

Het moet een openbare http(s)-URL zijn. Localhost, .local, private IP's (bijv. 10.*, 192.168.*) en URL's met embedded credentials worden geblokkeerd.

Bevestig dat de stem op deze lijst slaagde. Check je postback-logs of NuVotifier debug-output. Verifieer firewall allowlists en dat de gebruikersnaam overeenkomt met een in-game account. Lijst-cooldown is 24 uur; je eigen beloningscooldown kan verschillen.

Alleen A–Z, a–z, 0–9, _ en -. Alles anders wordt gestript. Houd parameters ≤ 32 tekens.