Recompensas de voto

Voting Check

Como recompensar jogadores depois que eles votam com sucesso na sua listagem no JoinGameServers.

Caminho de configuração: Painel → Editar servidor → Recompensas por voto (e Detalhes do Minecraft para Votifier).

01

Como funciona

  1. O jogador abre seu link de voto, idealmente com ?p=USERNAME para pré-preencher o formulário.

  2. Ele envia o voto. Aplicamos um cooldown de 24 horas por IP (e por conta se estiver logado). Se houver recompensas configuradas, o nome de usuário / parâmetro é obrigatório.

  3. Notificamos seus sistemas de recompensa: HTTP GET para sua URL de postback e/ou um pacote Votifier ao seu host Minecraft — com o mesmo parâmetro e o IP do votante.

  4. Você concede a recompensa. Falhas de entrega do seu lado são registradas aqui, mas não removem o voto.

Escolha um método

HTTP Postback

Ideal para sites, launchers e jogos que não são Minecraft. Para Minecraft, é uma alternativa opcional ao Votifier (ou um complemento se você também recompensa em um site).

  • Funciona para todos os jogos desta lista
  • Você controla pontos, cooldowns e logs
  • Precisa de um endpoint HTTPS público
Postback PHP →
Ideal para Minecraft

Minecraft Votifier

Preferido para Minecraft. Ideal para crates, keys e plugins listener in-game. Abrimos uma conexão TCP na sua porta Votifier.

  • Somente listagens de Minecraft
  • RSA classic ou token NuVotifier v2
  • Precisa de porta aberta + allowlist no firewall
Minecraft Votifier →

Para Minecraft, use Votifier primeiro. Postback HTTP é opcional (ou adicional). Cada canal ativo roda de forma independente após o voto.

Início rápido

  1. Faça login e abra o Painel.
  2. Edite sua listagem de servidor aprovada.
  3. Configure uma URL de postback e/ou ative Votifier em Detalhes do Minecraft.
  4. Copie o link de voto com incentivo do formulário (termina em ?p=USERNAME).
  5. Coloque esse link no seu site ou Discord; substitua USERNAME por jogador.
  6. Faça um voto de teste e confirme que as recompensas chegam.
02

Postback PHP

Após um voto bem-sucedido, consultamos sua URL com o parâmetro do jogador e o IP dele. Seu script marca essa conta como votada e concede pontos ou itens.

Coloque o IP público de saída deste site na allowlist do seu firewall e script de postback. Rejeite qualquer outra origem. Prefira HTTPS.

1. Configure sua URL de postback

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

https://YOURDOMAIN/postback.php
  • O nome do arquivo é arbitrário — use o caminho que preferir no seu stack.
  • Somente URLs http/https públicas são aceitas. Localhost, IPs LAN privados e credenciais na URL são rejeitados (proteção SSRF).
  • Seguimos um número limitado de redirecionamentos e expiramos em alguns segundos para manter o voto rápido.

2. Crie links de voto com incentivo

Adicione um parâmetro para identificar cada jogador ao chegar na página de voto.

/GAME/server/SLUG/vote?p=PARAMETER
Elemento Regras
PARAMETER / p_resp Apenas letras, números, _, - · máx. 32 caracteres · nome de usuário, id de conta ou qualquer id que você rastreia
ip IPv4 ou IPv6 do votante conforme visto nesta lista (consciente de proxy quando ativo)
Query de pré-preenchimento ?p= ou ?username=

3. O que chamamos após um voto

Somente em caso de sucesso. Se o jogador não completou um voto válido, não enviamos nenhuma requisição.

https://YOURDOMAIN/postback.php?p_resp=PARAMETER&ip=USERIP
Link com incentivo Nosso 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

Quando chamamos seu postback com p_resp=Razor, o jogador Razor votou. O valor ip é o endereço que ele usou nesta lista.

O que seu script deve fazer

  • Verificar que a requisição vem do IP público desta lista.
  • Sanitizar p_resp e ip (nunca confie em entrada bruta).
  • Confirmar que a conta / personagem existe no seu banco de dados.
  • Aplicar seu próprio cooldown de recompensa se precisar de algo mais rigoroso que 24 horas.
  • Conceder pontos, moedas ou itens; registrar o evento; retornar HTTP 200.

Exemplo postback.php

Hospede isso no seu site de recompensas, não necessariamente nesta lista de votos. Defina VOTE_LIST_IP com o IP público de saída deste site 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 o voto direto ao seu servidor Minecraft. Um plugin listener executa seus comandos de recompensa.

Firewall: permita TCP de entrada do IP público deste site na sua porta Votifier (padrão 8192). Não exponha a porta para toda a internet se puder evitar.

  1. O jogador informa o nome Minecraft na nossa página de voto (ou chega com ?p=Steve).

  2. O voto é bem-sucedido nesta lista.

  3. Conectamos ao seu host/porta Votifier e entregamos o pacote de voto.

  4. Seu listener concede crates, keys, dinheiro etc.

Ative Votifier em Detalhes do Minecraft, escolha NuVotifier v2 ou Classic e informe host, porta e token ou chave pública RSA.

Instale NuVotifier (RSA classic e protocolo v2) ou Votifier classic, mais um listener para sua versão do Minecraft (GAListener, SuperbVote ou personalizado).

Classic / v1: cole o arquivo public.key completo. Host e porta vêm do config.yml. Mantenha debug: true enquanto conecta esta lista, depois desative.

host: YOUR_PUBLIC_IP
port: 8192
debug: true

Pacotes identificam esta lista como: JoinGameServers

04

NuVotifier v2

O protocolo v2 substitui RSA por um token compartilhado e um challenge de uso único. Associe um token ao nome de serviço desta lista ou use o token padrão.

tokens:
  default: REPLACE_WITH_DEFAULT_TOKEN
  "JoinGameServers": REPLACE_WITH_LIST_TOKEN

Formato: conexão TCP → ler saudação VOTIFIER 2 <challenge> → payload JSON (username, serviceName, timestamp ms, address, challenge) → Base64(HMAC-SHA256(payload, token)) → magic 0x733A + length + JSON {signature, payload}. Espere {"status":"ok"}.

Sintoma Causa provável
Não é um servidor NuVotifier v2 Saudação sem challenge — use Classic ou atualize NuVotifier e ative v2.
Assinatura inválida / serviço desconhecido Token errado ou nome de serviço não associado. Adicione o nome de serviço da lista ou use o padrão.
Falha de conexão / timeout Host/porta incorretos, Votifier offline ou firewall bloqueando o IP desta lista.
Sem resposta Interferência de proxy/plugin; ative debug no NuVotifier e tente novamente.
05

Checklist de testes

  1. Salve as configurações da listagem sem erros de validação.
  2. Abra um link com incentivo — o campo de nome de usuário deve ser pré-preenchido por ?p=.
  3. Faça um voto. Você deve ver o estado de sucesso. Um segundo voto em 24 horas deve ser bloqueado.
  4. Verifique postback: ative DEBUG no seu receptor; confirme que p_resp e ip chegam.
  5. Verifique Votifier: com debug true, o console do Minecraft deve mostrar um voto entrante com seu nome de usuário e o nome de serviço desta lista.
  6. Confirme a recompensa in-game ou no site. Se não, corrija o listener — o voto na lista ainda conta.

Tentativas de entrega são registradas em vote_reward_logs (ok / fail / skipped). Um callback falho nunca reverte o voto nesta lista.

06

FAQ e solução de problemas

Não. Visitantes podem votar. Contas logadas seguem as mesmas regras de cooldown de 24 horas para evitar abuso.

Se você configurou uma URL de postback ou Votifier, precisamos de um parâmetro para saber quem recompensar. Sem recompensas configuradas, o nome de usuário continua opcional.

Sim. Ambos rodam após um voto bem-sucedido. Falhas são independentes.

Deve ser uma URL http(s) pública. Localhost, .local, IPs privados (ex.: 10.*, 192.168.*) e URLs com credenciais embutidas são bloqueadas.

Confirme que o voto foi bem-sucedido nesta lista. Verifique seus logs de postback ou a saída debug do NuVotifier. Confira allowlists do firewall e se o nome de usuário corresponde a uma conta in-game. O cooldown da lista é 24 horas; seu próprio cooldown de recompensa pode ser diferente.

Apenas A–Z, a–z, 0–9, _ e -. Qualquer outro é removido. Mantenha parâmetros ≤ 32 caracteres.