Ανταμοιβές ψήφου

Voting Check

Πώς ανταμείβεις παίκτες αφού ψηφίσουν επιτυχώς την καταχώρησή σου στο JoinGameServers.

Διαδρομή ρύθμισης: Πίνακας ελέγχου → Επεξεργασία server → Vote Rewards (και Λεπτομέρειες Minecraft για Votifier).

01

Πώς λειτουργεί

  1. Ο παίκτης ανοίγει τον σύνδεσμο ψήφου σου, ιδανικά με ?p=USERNAME ώστε η φόρμα να είναι προ συμπληρωμένη.

  2. Υποβάλλει την ψήφο. Εφαρμόζουμε cooldown 24 ωρών ανά IP (και ανά συνδεδεμένο λογαριασμό). Αν έχουν ρυθμιστεί rewards, απαιτείται το όνομα χρήστη / παράμετρος.

  3. Ειδοποιούμε τα συστήματα rewards σου: HTTP GET στο postback URL σου και/ή πακέτο Votifier στο Minecraft host σου — με την ίδια παράμετρο και το IP του ψηφοφόρου.

  4. Εσύ δίνεις το reward. Αποτυχίες παράδοσης από τη μεριά σου καταγράφονται εδώ αλλά δεν αφαιρούν την ψήφο.

Διάλεξε μέθοδο

HTTP Postback

Καλύτερο για ιστοσελίδες, launchers και παιχνίδια εκτός Minecraft. Για Minecraft είναι προαιρετική εναλλακτική του Votifier (ή επιπλέον αν ανταμείβεις και σε ιστοσελίδα).

  • Λειτουργεί για κάθε παιχνίδι σε αυτή τη λίστα
  • Εσύ ελέγχεις πόντους, cooldowns, logging
  • Χρειάζεται δημόσιο HTTPS endpoint
Postback PHP →
Καλύτερο για Minecraft

Minecraft Votifier

Προτιμότερο για Minecraft. Ιδανικό για in-game crates, keys και listener plugins. Ανοίγουμε TCP σύνδεση στο port Votifier σου.

  • Μόνο καταχωρήσεις Minecraft
  • Classic RSA ή token NuVotifier v2
  • Χρειάζεται ανοιχτό port + firewall allowlist
Minecraft Votifier →

Για Minecraft, χρησιμοποίησε πρώτα Votifier. Το HTTP postback είναι προαιρετικό (ή επιπλέον). Κάθε ενεργό κανάλι τρέχει ανεξάρτητα μετά την ψήφο.

Γρήγορη εκκίνηση

  1. Συνδέσου και άνοιξε τον Πίνακα ελέγχου.
  2. Επεξεργάσου την εγκεκριμένη καταχώρηση server σου.
  3. Όρισε Postback URL και/ή ενεργοποίησε Votifier στις Λεπτομέρειες Minecraft.
  4. Αντίγραψε το incentive voting link από τη φόρμα επεξεργασίας (τελειώνει με ?p=USERNAME).
  5. Βάλε αυτόν τον σύνδεσμο στην ιστοσελίδα ή το Discord σου· αντικατέστησε το USERNAME ανά παίκτη.
  6. Κάνε δοκιμαστική ψήφο και επιβεβαίωσε ότι φτάνουν τα rewards.
02

Postback PHP

Μετά από επιτυχημένη ψήφο ζητάμε το URL σου με την παράμετρο παίκτη και το IP του. Το script σου σημειώνει ότι ο λογαριασμός ψήφισε και δίνει πόντους ή αντικείμενα.

Βάλε σε whitelist το δημόσιο outbound IP αυτής της ιστοσελίδας στο firewall και στο postback script σου. Απόρριψε κάθε άλλη πηγή. Προτίμησε HTTPS.

1. Όρισε το Postback URL σου

Πίνακας ελέγχου → Επεξεργασία server → Vote Rewards → Postback URL.

https://YOURDOMAIN/postback.php
  • Το όνομα αρχείου είναι αυθαίρετο — χρησιμοποίησε όποιο path προτιμά το stack σου.
  • Δεκτά είναι μόνο δημόσια http/https URLs. Localhost, ιδιωτικά LAN IPs και credentials σε URL απορρίπτονται (προστασία SSRF).
  • Ακολουθούμε λίγα redirects και κάνουμε timeout μετά από λίγα δευτερόλεπτα ώστε η ψήφος να μένει γρήγορη.

2. Φτιάξε incentive voting links

Πρόσθεσε παράμετρο ώστε κάθε παίκτης να αναγνωρίζεται όταν φτάνει στη σελίδα ψήφου.

/GAME/server/SLUG/vote?p=PARAMETER
Κομμάτι Κανόνες
PARAMETER / p_resp Μόνο γράμματα, αριθμοί, _, - · έως 32 χαρακτήρες · όνομα χρήστη, account id ή οποιοδήποτε id παρακολουθείς
ip IPv4 ή IPv6 του ψηφοφόρου όπως το βλέπει αυτή η λίστα (proxy-aware όταν είναι ενεργό)
Query προ συμπλήρωσης ?p= ή ?username=

3. Τι καλούμε μετά από ψήφο

Μόνο σε επιτυχία. Αν ο παίκτης δεν ολοκλήρωσε έγκυρη ψήφο, δεν στέλνουμε αίτημα.

https://YOURDOMAIN/postback.php?p_resp=PARAMETER&ip=USERIP
Incentive link Το 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 είναι η διεύθυνση που χρησιμοποίησε σε αυτή τη λίστα.

Τι πρέπει να κάνει το script σου

  • Επαλήθευσε ότι το αίτημα προέρχεται από το δημόσιο IP αυτής της λίστας.
  • Καθάρισε τα p_resp και ip (μην εμπιστεύεσαι ποτέ raw input).
  • Επιβεβαίωσε ότι ο λογαριασμός / χαρακτήρας υπάρχει στη βάση σου.
  • Εφάρμοσε δικό σου reward cooldown αν χρειάζεσαι κάτι πιο αυστηρό από 24 ώρες.
  • Δώσε πόντους, coins ή αντικείμενα· κατέγραψε το γεγονός· επέστρεψε HTTP 200.

παράδειγμα postback.php

Φιλοξένησέ το στο rewards site σου, όχι απαραίτητα σε αυτή τη λίστα ψήφων. Όρισε το VOTE_LIST_IP στο outbound δημόσιο IP αυτής της ιστοσελίδας πριν πας 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

Μπορούμε να σπρώξουμε την ψήφο απευθείας στον Minecraft server σου. Ένα listener plugin τρέχει μετά τις εντολές reward σου.

Firewall: επίτρεψε inbound TCP από το δημόσιο IP αυτής της ιστοσελίδας στο port Votifier σου (προεπιλογή 8192). Μην εκθέτεις το port σε όλο το internet αν μπορείς να το αποφύγεις.

  1. Ο παίκτης βάζει το Minecraft username του στη σελίδα ψήφου μας (ή φτάνει μέσω ?p=Steve).

  2. Η ψήφος επιτυγχάνει σε αυτή τη λίστα.

  3. Συνδεόμαστε στο host/port Votifier σου και παραδίδουμε το πακέτο ψήφου.

  4. Το listener σου δίνει crates, keys, χρήματα κ.λπ.

Ενεργοποίησε Votifier στις Λεπτομέρειες Minecraft, διάλεξε NuVotifier v2 ή Classic και μετά βάλε host, port και token ή δημόσιο κλειδί RSA.

Εγκατέστησε NuVotifier (classic RSA και πρωτόκολλο v2) ή classic Votifier, συν listener για την έκδοση Minecraft σου (GAListener, SuperbVote ή custom listener).

Classic / v1: επικόλλησε το πλήρες αρχείο public.key. Host και port προέρχονται από το config.yml. Κράτα debug: true όσο συνδέεις αυτή τη λίστα και μετά απενεργοποίησέ το.

host: YOUR_PUBLIC_IP
port: 8192
debug: true

Τα πακέτα αναγνωρίζουν αυτή τη λίστα ως: JoinGameServers

04

NuVotifier v2

Το πρωτόκολλο v2 αντικαθιστά το RSA με κοινόχρηστο token και one-time challenge. Αντιστοίχισε token στο service name αυτής της λίστας ή χρησιμοποίησε το προεπιλεγμένο token.

tokens:
  default: REPLACE_WITH_DEFAULT_TOKEN
  "JoinGameServers": REPLACE_WITH_LIST_TOKEN

Wire format: 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"}.

Σύμπτωμα Πιθανή αιτία
Δεν είναι server NuVotifier v2 Το greeting δεν έχει challenge — χρησιμοποίησε Classic ή αναβάθμισε το NuVotifier και ενεργοποίησε v2.
Μη έγκυρη υπογραφή / άγνωστο service Λάθος token ή το service name δεν είναι mapped. Πρόσθεσε το service name της λίστας ή χρησιμοποίησε το default.
Αποτυχία σύνδεσης / timeout Λάθος host/port, Votifier offline ή το firewall μπλοκάρει το IP αυτής της λίστας.
Καμία απάντηση Παρέμβαση proxy/plugin· ενεργοποίησε NuVotifier debug και δοκίμασε ξανά.
05

Checklist δοκιμών

  1. Αποθήκευσε τις ρυθμίσεις καταχώρησης χωρίς σφάλματα επικύρωσης.
  2. Άνοιξε ένα incentive link — το πεδίο ονόματος χρήστη πρέπει να προ συμπληρώνεται από ?p=.
  3. Κάνε μία ψήφο. Πρέπει να δεις την κατάσταση επιτυχίας. Δεύτερη ψήφος εντός 24 ωρών πρέπει να μπλοκάρεται.
  4. Επαλήθευσε postback: ενεργοποίησε DEBUG στον receiver σου· επιβεβαίωσε ότι φτάνουν p_resp και ip.
  5. Επαλήθευσε Votifier: με debug true, η κονσόλα Minecraft πρέπει να δείχνει εισερχόμενη ψήφο για το username σου και το service name αυτής της λίστας.
  6. Επιβεβαίωσε το in-game ή site reward. Αν όχι, διόρθωσε το listener — η ψήφος στη λίστα μετράει ακόμα.

Οι προσπάθειες παράδοσης καταγράφονται στο vote_reward_logs (ok / fail / skipped). Ένα αποτυχημένο callback δεν αναιρεί ποτέ την ψήφο σε αυτή τη λίστα.

06

Συχνές ερωτήσεις & αντιμετώπιση προβλημάτων

Όχι. Οι επισκέπτες μπορούν να ψηφίζουν. Οι συνδεδεμένοι λογαριασμοί μοιράζονται τους ίδιους κανόνες cooldown 24 ωρών για αποτροπή κατάχρησης.

Αν έχεις ρυθμίσει postback URL ή Votifier, χρειαζόμαστε παράμετρο για να σου πούμε ποιον να ανταμείψεις. Χωρίς ρυθμισμένα rewards, το όνομα χρήστη μένει προαιρετικό.

Ναι. Και τα δύο τρέχουν μετά από επιτυχημένη ψήφο. Οι αποτυχίες είναι ανεξάρτητες.

Πρέπει να είναι δημόσιο http(s) URL. Localhost, .local, ιδιωτικά IPs (π.χ. 10.*, 192.168.*) και URLs με ενσωματωμένα credentials μπλοκάρονται.

Επιβεβαίωσε ότι η ψήφος πέτυχε σε αυτή τη λίστα. Έλεγξε τα postback logs ή το NuVotifier debug output. Επαλήθευσε firewall allowlists και ότι το username ταιριάζει με in-game λογαριασμό. Το cooldown της λίστας είναι 24 ώρες· το δικό σου reward cooldown μπορεί να διαφέρει.

Μόνο A–Z, a–z, 0–9, _ και -. Οτιδήποτε άλλο αφαιρείται. Κράτα τις παραμέτρους ≤ 32 χαρακτήρες.