Nasıl çalışır?

  1. Profilini ücretsiz ekle. Profil yayına girince yönetim sayfasında oy bağlantın, “Bize oy ver” düğmen ve gizli anahtarın hazır olur.
  2. Profil bilgilerinde Oy bildirim adresi alanına sunucundaki karşılayıcı adresi yaz, örneğin https://sunucun.com/oy-odul.php. Adres https ile başlamalı.
  3. Oyuncu oy sayfasında karakter adını yazıp oy verdiğinde PvPYeri bu adrese bir GET isteği gönderir.
  4. Kodun imzayı doğrular, oyun aynı vote_id ile daha önce ödüllendirilmemişse ödülü verir ve 2xx yanıt döner.
  5. Yanıt 2xx değilse ya da sunucuna ulaşılamazsa bildirim 5 kez, artan aralıklarla yeniden denenir.

Gönderilen parametreler

ParametreAnlamı
playerOyuncunun oy sayfasına yazdığı karakter adı. Oy bağlantısına ?kullanici=KARAKTER eklersen form dolu açılır.
vote_idOyun benzersiz numarası. Aynı oy için gelen tekrar bildirimlerini ayırt etmek için kullan.
weightOyun sıralamaya eklediği puan: varsayılan olarak misafir oyu 1, doğrulanmış üye oyu 2. Coinle verilen ekstra oylarda kullanılan coin kadar.
sourceOyun türü: free (günlük ücretsiz oy) veya coin (ekstra oy).
signature2Önerilen imza: HMAC-SHA256(player|vote_id|weight|source|server|time, gizli anahtar). Puanı da kapsadığı için değiştirilmiş isteği yakalar.
serverProfil adresindeki kısa ad, örneğin /sunucu/ornek2 için ornek2.
timeBildirimin oluşturulduğu an, Unix zaman damgası (saniye).
signatureHMAC-SHA256(player|vote_id|time) değeri; anahtar profil yönetim sayfandaki gizli anahtardır.

Örnek istek: https://sunucun.com/oy-odul.php?player=Ejder&vote_id=48211&weight=2&source=free&server=ornek2&time=1791720000&signature=3f9c…

Örnek PHP karşılayıcı

Aşağıdaki dosya imzayı doğrular, aynı oyu ikinci kez ödüllendirmez ve ödülü kuyruğa ekler. Ödül tablosunu kendi oyun dosyalarındaki düzene göre uyarla.

<?php
// oy-odul.php — PvPYeri oy ödülü (Vote4Buff) bildirimi
$secret = 'PANELDEKI_GIZLI_ANAHTAR';            // Profil yönetimi → Oy ödülü bildirimi

$player   = (string)($_GET['player'] ?? '');
$voteId   = (int)($_GET['vote_id'] ?? 0);
$time     = (int)($_GET['time'] ?? 0);
$weight   = (int)($_GET['weight'] ?? 1);
$source   = (string)($_GET['source'] ?? 'free');
$server   = (string)($_GET['server'] ?? '');
$given    = (string)($_GET['signature2'] ?? '');

// 1. İmzayı doğrula: HMAC-SHA256(player|vote_id|weight|source|server|time, gizli anahtar)
//    signature2 puanı (weight) da kapsar; değiştirilmiş bir istek reddedilir.
$expected = hash_hmac('sha256', implode('|', [$player, $voteId, $weight, $source, $server, $time]), $secret);
if ($player === '' || !hash_equals($expected, $given) || abs(time() - $time) > 7200) {
    http_response_code(403);
    exit('gecersiz');
}

// 2. Aynı oyu iki kez ödüllendirme: vote_id her oyda benzersizdir.
$db = new PDO('mysql:host=127.0.0.1;dbname=player;charset=utf8mb4', 'KULLANICI', 'PAROLA');
$log = $db->prepare('INSERT IGNORE INTO pvpyeri_oy (vote_id, player, weight, created_at) VALUES (?, ?, ?, NOW())');
$log->execute([$voteId, $player, $weight]);

// 3. İlk kez gelen oyda ödülü ver (kendi ödül tablona / item_award düzenine göre uyarla).
if ($log->rowCount() === 1) {
    $award = $db->prepare('INSERT INTO odul_kuyrugu (player, odul, created_at) VALUES (?, ?, NOW())');
    $award->execute([$player, 'oy_buff']);
}

// 4. 2xx yanıt ver; aksi halde PvPYeri bildirimi tekrar dener.
echo 'OK';

Oy kayıt tablosu:

CREATE TABLE pvpyeri_oy (
  vote_id    BIGINT UNSIGNED PRIMARY KEY,
  player     VARCHAR(40) NOT NULL,
  weight     SMALLINT UNSIGNED NOT NULL DEFAULT 1,
  created_at DATETIME NOT NULL
);

Güvenlik önerileri

  • İmzayı mutlaka hash_equals ile karşılaştır; imzasız ya da süresi geçmiş istekleri reddet.
  • Gizli anahtarı oyun istemcisine, herkese açık depolara veya Discord kanallarına koyma. Anahtar sızarsa profil yönetiminden yenile.
  • vote_id alanını benzersiz tut; yeniden denemeler aynı oyu tekrar gönderebilir.
  • Karakter adını oyun veritabanında ararken hazırlanmış sorgu (prepared statement) kullan.

Oyuncularını oya yönlendir

Oy bağlantını oyun içi duyurulara, Discord'a ve sitene ekle. Bağlantının sonuna ?kullanici=KARAKTER_ADI eklersen oy formu karakter adıyla dolu açılır. Sitene oy toplama rehberindeki yöntemlerle “Bize oy ver” düğmesini ve canlı sıralama rozetini koyabilirsin; rozet bu ayki sıranı kendiliğinden gösterir.

Sık sorulan sorular

Oy ödülü sistemi ücretli mi?

Hayır. Oy bildirimi, oy bağlantısı, düğme ve rozet her yayındaki sunucu profili için ücretsizdir.

Oyuncu karakter adını yazmazsa ne olur?

Oy sıralamaya yine eklenir, ama bildirimde karakter adı boş gelir. Örnek kod boş adı reddeder; bu durumda ödül verilmez.

Oylar satın alınabilir mi?

Hayır. Aylık sıralama yalnızca oyuncu oylarıyla oluşur; sponsorlu alanlar sıralamayı değiştirmez. Her oyuncu her sunucuya günde bir kez ücretsiz oy verebilir.