Nasıl çalışır?
- 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.
- 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ı. - Oyuncu oy sayfasında karakter adını yazıp oy verdiğinde PvPYeri bu adrese bir GET isteği gönderir.
- Kodun imzayı doğrular, oyun aynı
vote_idile daha önce ödüllendirilmemişse ödülü verir ve 2xx yanıt döner. - Yanıt 2xx değilse ya da sunucuna ulaşılamazsa bildirim 5 kez, artan aralıklarla yeniden denenir.
Gönderilen parametreler
| Parametre | Anlamı |
|---|---|
player | Oyuncunun oy sayfasına yazdığı karakter adı. Oy bağlantısına ?kullanici=KARAKTER eklersen form dolu açılır. |
vote_id | Oyun benzersiz numarası. Aynı oy için gelen tekrar bildirimlerini ayırt etmek için kullan. |
weight | Oyun sıralamaya eklediği puan: varsayılan olarak misafir oyu 1, doğrulanmış üye oyu 2. Coinle verilen ekstra oylarda kullanılan coin kadar. |
source | Oyun 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. |
server | Profil adresindeki kısa ad, örneğin /sunucu/ornek2 için ornek2. |
time | Bildirimin oluşturulduğu an, Unix zaman damgası (saniye). |
signature | HMAC-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_equalsile 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_idalanı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.