Recompensas de voto

Voting Check

Cómo recompensar a los jugadores tras votar con éxito por tu listado en JoinGameServers.

Ruta de configuración: Panel → Editar servidor → Recompensas por voto (y Detalles de Minecraft para Votifier).

01

Cómo funciona

  1. El jugador abre tu enlace de voto, idealmente con ?p=USERNAME para prefijar el formulario.

  2. Envía el voto. Aplicamos un cooldown de 24 horas por IP (y por cuenta si ha iniciado sesión). Si hay recompensas configuradas, el nombre de usuario / parámetro es obligatorio.

  3. Notificamos tus sistemas de recompensa: HTTP GET a tu URL de postback y/o un paquete Votifier a tu host de Minecraft — con el mismo parámetro y la IP del votante.

  4. Tú otorgas la recompensa. Los fallos de entrega en tu lado se registran aquí pero no eliminan el voto.

Elige un método

HTTP Postback

Ideal para sitios web, launchers y juegos que no sean Minecraft. Para Minecraft es una alternativa opcional a Votifier (o un complemento si también recompensas en un sitio web).

  • Funciona para todos los juegos de esta lista
  • Tú controlas puntos, cooldowns y registros
  • Requiere un endpoint HTTPS público
Postback PHP →
Ideal para Minecraft

Minecraft Votifier

Preferido para Minecraft. Ideal para cajas, llaves y plugins listener en el juego. Abrimos una conexión TCP a tu puerto Votifier.

  • Solo listados de Minecraft
  • RSA classic o token NuVotifier v2
  • Requiere puerto abierto + lista blanca en el firewall
Minecraft Votifier →

Para Minecraft, usa Votifier primero. El postback HTTP es opcional (o adicional). Cada canal activo se ejecuta de forma independiente tras el voto.

Inicio rápido

  1. Inicia sesión y abre el Panel.
  2. Edita tu listado de servidor aprobado.
  3. Configura una URL de postback y/o activa Votifier en Detalles de Minecraft.
  4. Copia el enlace de voto con incentivo del formulario (termina en ?p=USERNAME).
  5. Coloca ese enlace en tu sitio web o Discord; sustituye USERNAME por jugador.
  6. Emite un voto de prueba y confirma que lleguen las recompensas.
02

Postback PHP

Tras un voto exitoso solicitamos tu URL con el parámetro del jugador y su IP. Tu script marca esa cuenta como votada y otorga puntos o ítems.

Añade la IP pública de salida de este sitio a la lista blanca de tu firewall y script de postback. Rechaza cualquier otra fuente. Prefiere HTTPS.

1. Configura tu URL de postback

Panel → Editar servidor → Recompensas por voto → URL de postback.

https://YOURDOMAIN/postback.php
  • El nombre del archivo es arbitrario — usa la ruta que prefiera tu stack.
  • Solo se aceptan URLs http/https públicas. Localhost, IPs LAN privadas y credenciales en la URL se rechazan (protección SSRF).
  • Seguimos un número limitado de redirecciones y agotamos el tiempo en unos segundos para que el voto sea rápido.

2. Crea enlaces de voto con incentivo

Añade un parámetro para identificar a cada jugador al llegar a la página de voto.

/GAME/server/SLUG/vote?p=PARAMETER
Elemento Reglas
PARAMETER / p_resp Solo letras, números, _, - · máx. 32 caracteres · nombre de usuario, id de cuenta o cualquier id que rastrees
ip IPv4 o IPv6 del votante según esta lista (consciente de proxy cuando está activo)
Consulta de prefijado ?p= o ?username=

3. Qué llamamos tras un voto

Solo si tiene éxito. Si el jugador no completó un voto válido, no enviamos ninguna petición.

https://YOURDOMAIN/postback.php?p_resp=PARAMETER&ip=USERIP
Enlace con incentivo Nuestro 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

Cuando llamamos a tu postback con p_resp=Razor, el jugador Razor ha votado. El valor ip es la dirección que usó en esta lista.

Qué debe hacer tu script

  • Verificar que la petición proviene de la IP pública de esta lista.
  • Sanitizar p_resp e ip (nunca confíes en la entrada sin filtrar).
  • Confirmar que la cuenta / personaje existe en tu base de datos.
  • Aplicar tu propio cooldown de recompensa si necesitas algo más estricto que 24 horas.
  • Otorgar puntos, monedas o ítems; registrar el evento; devolver HTTP 200.

Ejemplo postback.php

Alójalo en tu sitio de recompensas, no necesariamente en esta lista de votos. Configura VOTE_LIST_IP con la IP pública de salida de este sitio antes de publicar.

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

Podemos enviar el voto directamente a tu servidor de Minecraft. Un plugin listener ejecuta entonces tus comandos de recompensa.

Firewall: permite TCP entrante desde la IP pública de este sitio a tu puerto Votifier (predeterminado 8192). No expongas el puerto a todo internet si puedes evitarlo.

  1. El jugador introduce su nombre de Minecraft en nuestra página de voto (o llega con ?p=Steve).

  2. El voto tiene éxito en esta lista.

  3. Nos conectamos a tu host/puerto Votifier y entregamos el paquete de voto.

  4. Tu listener otorga cajas, llaves, dinero, etc.

Activa Votifier en Detalles de Minecraft, elige NuVotifier v2 o Classic, e introduce host, puerto y token o clave pública RSA.

Instala NuVotifier (RSA classic y protocolo v2) o Votifier classic, más un listener para tu versión de Minecraft (GAListener, SuperbVote o uno personalizado).

Classic / v1: pega el archivo public.key completo. Host y puerto vienen de config.yml. Mantén debug: true mientras conectas esta lista, luego desactívalo.

host: YOUR_PUBLIC_IP
port: 8192
debug: true

Los paquetes identifican esta lista como: JoinGameServers

04

NuVotifier v2

El protocolo v2 sustituye RSA por un token compartido y un challenge de un solo uso. Asocia un token al nombre de servicio de esta lista o usa el token por defecto.

tokens:
  default: REPLACE_WITH_DEFAULT_TOKEN
  "JoinGameServers": REPLACE_WITH_LIST_TOKEN

Formato: conexión TCP → leer saludo VOTIFIER 2 <challenge> → payload JSON (username, serviceName, timestamp ms, address, challenge) → Base64(HMAC-SHA256(payload, token)) → magic 0x733A + length + JSON {signature, payload}. Espera {"status":"ok"}.

Síntoma Causa probable
No es un servidor NuVotifier v2 El saludo no tiene challenge — usa Classic o actualiza NuVotifier y activa v2.
Firma no válida / servicio desconocido Token incorrecto o nombre de servicio no asociado. Añade el nombre de servicio de la lista o usa el predeterminado.
Conexión fallida / timeout Host/puerto incorrecto, Votifier offline o firewall bloqueando la IP de esta lista.
Sin respuesta Interferencia de proxy/plugin; activa debug en NuVotifier e inténtalo de nuevo.
05

Lista de pruebas

  1. Guarda la configuración del listado sin errores de validación.
  2. Abre un enlace con incentivo — el campo de nombre de usuario debe prefijarse desde ?p=.
  3. Emite un voto. Debes ver el estado de éxito. Un segundo voto en 24 horas debe bloquearse.
  4. Verifica postback: activa DEBUG en tu receptor; confirma que lleguen p_resp e ip.
  5. Verifica Votifier: con debug true, la consola de Minecraft debe mostrar un voto entrante con tu nombre de usuario y el nombre de servicio de esta lista.
  6. Confirma la recompensa en el juego o en el sitio. Si no, corrige el listener — el voto en la lista sigue contando.

Los intentos de entrega se registran en vote_reward_logs (ok / fail / skipped). Un callback fallido nunca revierte el voto en esta lista.

06

FAQ y solución de problemas

No. Los invitados pueden votar. Las cuentas con sesión comparten las mismas reglas de cooldown de 24 horas para evitar abusos.

Si configuraste una URL de postback o Votifier, necesitamos un parámetro para saber a quién recompensar. Sin recompensas configuradas, el nombre de usuario sigue siendo opcional.

Sí. Ambos se ejecutan tras un voto exitoso. Los fallos son independientes.

Debe ser una URL http(s) pública. Localhost, .local, IPs privadas (p. ej. 10.*, 192.168.*) y URLs con credenciales incrustadas están bloqueadas.

Confirma que el voto tuvo éxito en esta lista. Revisa tus logs de postback o la salida debug de NuVotifier. Verifica listas blancas del firewall y que el nombre de usuario coincida con una cuenta en el juego. El cooldown de la lista es 24 horas; tu propio cooldown de recompensa puede diferir.

Solo A–Z, a–z, 0–9, _ y -. Cualquier otro se elimina. Mantén los parámetros ≤ 32 caracteres.