Oy ödülleri

Voting Check

JoinGameServers'ta kaydına başarıyla oy verdikten sonra oyuncuları nasıl ödüllendirirsin.

Kurulum yolu: Panel → Serverı düzenle → Vote Ödülleri (Votifier için Minecraft Detayları).

01

Nasıl çalışır

  1. Oyuncu vote linkini açar; tercihen ?p=USERNAME ile form önceden dolu gelir.

  2. Oyu gönderir. IP başına (ve giriş yapılmış hesap başına) 24 saatlik cooldown uygularız. Ödüller yapılandırıldıysa kullanıcı adı / parametre zorunludur.

  3. Ödül sistemlerini bilgilendiririz: postback URL'ine HTTP GET ve/veya Minecraft host'una Votifier paketi — aynı parametre ve oy veren kişinin IP'siyle.

  4. Sen ödülü verirsin. Senin taraftaki teslimat hataları burada loglanır ama oyu silmez.

Bir yöntem seç

HTTP Postback

Website'ler, launcher'lar ve Minecraft dışı oyunlar için en iyisi. Minecraft'ta Votifier'a isteğe bağlı alternatif (veya website'te de ödül veriyorsan ek kanal).

  • Bu listedeki her oyun için çalışır
  • Puanları, cooldown'ları, loglamayı sen kontrol edersin
  • Herkese açık bir HTTPS endpoint gerekir
Postback PHP →
Minecraft için en iyisi

Minecraft Votifier

Minecraft için tercih edilir. Oyun içi crate, key ve listener plugin'ler için en iyisi. Votifier portuna TCP bağlantısı açarız.

  • Yalnızca Minecraft kayıtları
  • Classic RSA veya NuVotifier v2 token
  • Açık port + firewall allowlist gerekir
Minecraft Votifier →

Minecraft için önce Votifier kullan. HTTP postback isteğe bağlıdır (veya ek). Etkin her kanal, oydan sonra bağımsız çalışır.

Hızlı başlangıç

  1. Giriş yap ve Panel'i aç.
  2. Onaylı server kaydını düzenle.
  3. Postback URL ayarla ve/veya Minecraft Detayları altında Votifier'ı aç.
  4. Düzenleme formundan teşvik vote linkini kopyala (?p=USERNAME ile biter).
  5. Bu linki website'ine veya Discord'una koy; her oyuncu için USERNAME'i değiştir.
  6. Test oyu ver ve ödüllerin geldiğini doğrula.
02

Postback PHP

Başarılı bir oydan sonra URL'ini oyuncu parametresi ve IP'siyle isteriz. Script'in o hesabı oy vermiş olarak işaretler ve puan veya eşya verir.

Firewall ve postback script'inde bu sitenin herkese açık çıkış IP'sini whitelist'e al. Diğer tüm kaynakları reddet. HTTPS tercih et.

1. Postback URL'ini ayarla

Panel → Serverı düzenle → Vote Ödülleri → Postback URL.

https://YOURDOMAIN/postback.php
  • Dosya adı serbest — stack'inin sevdiği herhangi bir yolu kullan.
  • Yalnızca herkese açık http/https URL'leri kabul edilir. Localhost, özel LAN IP'leri ve URL kimlik bilgileri reddedilir (SSRF koruması).
  • Birkaç yönlendirmeyi takip ederiz ve oylama hızlı kalsın diye birkaç saniye sonra zaman aşımına uğrarız.

2. Teşvik vote linklerini oluştur

Oyuncu vote sayfasına geldiğinde tanınsın diye bir parametre ekle.

/GAME/server/SLUG/vote?p=PARAMETER
Parça Kurallar
PARAMETER / p_resp Yalnızca harf, rakam, _, - · en fazla 32 karakter · kullanıcı adı, hesap id'si veya takip ettiğin herhangi bir id
ip Bu listenin gördüğü oy verenin IPv4 veya IPv6'sı (etkinse proxy-aware)
Ön doldurma sorgusu ?p= veya ?username=

3. Oydan sonra ne çağırırız

Yalnızca başarıda. Oyuncu geçerli bir oyu tamamlamadıysa istek göndermeyiz.

https://YOURDOMAIN/postback.php?p_resp=PARAMETER&ip=USERIP
Teşvik linki Callback'imiz
/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'ine p_resp=Razor ile geldiğimizde oyuncu Razor oy vermiştir. ip değeri, bu listede kullandığı adrestir.

Script'in ne yapmalı

  • İsteğin bu listenin herkese açık IP'sinden geldiğini doğrula.
  • p_resp ve ip'yi temizle (ham girdiye asla güvenme).
  • Hesabın / karakterin veritabanında var olduğunu onayla.
  • 24 saatten daha sıkı bir şey istiyorsan kendi ödül cooldown'unu uygula.
  • Puan, coin veya eşya ver; olayı logla; HTTP 200 döndür.

postback.php örneği

Bunu ödül sitende barındır; mutlaka bu vote listesinde olması gerekmez. Canlıya almadan önce VOTE_LIST_IP'yi bu sitenin çıkış herkese açık IP'sine ayarla.

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

Oyu doğrudan Minecraft serverına itebiliriz. Bir listener plugin sonra ödül komutlarını çalıştırır.

Firewall: bu sitenin herkese açık IP'sinden Votifier portuna (varsayılan 8192) gelen TCP'ye izin ver. Mümkünse portu tüm internete açma.

  1. Oyuncu vote sayfamızda Minecraft kullanıcı adını girer (veya ?p=Steve ile gelir).

  2. Oy bu listede başarılı olur.

  3. Votifier host/portuna bağlanırız ve vote paketini iletiriz.

  4. Listener'ın crate, key, para vb. verir.

Minecraft Detayları altında Votifier'ı aç, NuVotifier v2 veya Classic seç, sonra host, port ve token veya RSA public key gir.

NuVotifier (classic RSA ve protokol v2) veya classic Votifier kur; üstüne Minecraft sürümün için bir listener (GAListener, SuperbVote veya özel listener) ekle.

Classic / v1: tam public.key dosyasını yapıştır. Host ve port config.yml'den gelir. Bu listeye bağlanırken debug: true tut, sonra kapat.

host: YOUR_PUBLIC_IP
port: 8192
debug: true

Paketler bu listeyi şöyle tanımlar: JoinGameServers

04

NuVotifier v2

Protokol v2, RSA yerine paylaşılan token ve tek kullanımlık challenge kullanır. Bu listenin service adına bir token eşle veya varsayılan token'ı kullan.

tokens:
  default: REPLACE_WITH_DEFAULT_TOKEN
  "JoinGameServers": REPLACE_WITH_LIST_TOKEN

Wire formatı: TCP bağlan → VOTIFIER 2 <challenge> selamını oku → JSON payload (username, serviceName, timestamp ms, address, challenge) → Base64(HMAC-SHA256(payload, token)) → magic 0x733A + length + JSON {signature, payload}. {"status":"ok"} bekle.

Belirti Olası neden
NuVotifier v2 serverı değil Selamda challenge yok — Classic kullan veya NuVotifier'ı yükseltip v2'yi aç.
Geçersiz imza / bilinmeyen service Yanlış token veya service adı eşlenmemiş. Liste service adını ekle veya varsayılanı kullan.
Bağlantı başarısız / zaman aşımı Kötü host/port, Votifier offline veya firewall bu listenin IP'sini engelliyor.
Yanıt yok Proxy/plugin müdahalesi; NuVotifier debug'ı aç ve tekrar dene.
05

Test kontrol listesi

  1. Kayıt ayarlarını doğrulama hatası olmadan kaydet.
  2. Bir teşvik linki aç — kullanıcı adı alanı ?p= ile dolmalı.
  3. Bir oy ver. Başarı durumunu görmelisin. 24 saat içinde ikinci oy engellenmeli.
  4. Postback'i doğrula: alıcında DEBUG'ı aç; p_resp ve ip'nin geldiğini onayla.
  5. Votifier'ı doğrula: debug true iken Minecraft konsolu kullanıcı adın ve bu listenin service adı için gelen oyu göstermeli.
  6. Oyun içi veya site ödülünü onayla. Yoksa listener'ı düzelt — listedeki oy yine de sayılır.

Teslimat denemeleri vote_reward_logs'ta kaydedilir (ok / fail / skipped). Başarısız callback, bu listedeki oyu asla geri almaz.

06

SSS & sorun giderme

Hayır. Misafirler oy verebilir. Giriş yapılmış hesaplar, kötüye kullanımı önlemek için aynı 24 saatlik cooldown kurallarını paylaşır.

Postback URL veya Votifier yapılandırdıysan kime ödül vereceğini söylemek için bir parametre gerekir. Ödül yapılandırılmamışsa kullanıcı adı isteğe bağlı kalır.

Evet. İkisi de başarılı oydan sonra çalışır. Hatalar birbirinden bağımsızdır.

Herkese açık bir http(s) URL olmalı. Localhost, .local, özel IP'ler (örn. 10.*, 192.168.*) ve gömülü kimlik bilgili URL'ler engellenir.

Oyun bu listede başarılı olduğunu onayla. Postback loglarına veya NuVotifier debug çıktısına bak. Firewall allowlist'lerini ve kullanıcı adının oyun içi hesapla eşleştiğini doğrula. Liste cooldown'u 24 saattir; kendi ödül cooldown'un farklı olabilir.

Yalnızca A–Z, a–z, 0–9, _ ve -. Diğer her şey temizlenir. Parametreleri ≤ 32 karakter tut.