مكافآت التصويت

التحقق من التصويت

كيف تكافئ اللاعبين بعد تصويتهم بنجاح لإدراجك على JoinGameServers.

مسار الإعداد: لوحة التحكم ← تعديل السيرفر ← مكافآت التصويت (وتفاصيل Minecraft لـ Votifier).

01

كيف يعمل

  1. يفتح اللاعب رابط تصويتك، ويفضَّل مع ?p=USERNAME ليُملأ النموذج مسبقاً.

  2. يرسل التصويت. نفرض فترة انتظار 24 ساعة لكل IP (ولكل حساب مسجّل). إذا كانت المكافآت مُعدّة، يلزم اسم المستخدم / المعامل.

  3. نُبلّغ أنظمة مكافآتك: طلب HTTP GET إلى رابط postback و/أو حزمة Votifier إلى مضيف Minecraft — بنفس المعامل وعنوان IP للمصوّت.

  4. تمنح المكافأة. إخفاقات التسليم من جانبك تُسجَّل هنا دون إزالة التصويت.

اختر طريقة

HTTP Postback

الأفضل للمواقع واللانشرات والألعاب غير Minecraft. لـ Minecraft بديل اختياري لـ Votifier (أو إضافة إن كافأت أيضاً على موقع).

  • يعمل لكل لعبة في هذه القائمة
  • أنت تتحكم بالنقاط وفترات الانتظار والسجلات
  • يلزم نقطة نهاية HTTPS عامة
Postback PHP →
الأفضل لماينكرافت

Minecraft Votifier

المفضّل لـ Minecraft. الأفضل للصناديق والمفاتيح وإضافات الاستماع داخل اللعبة. نفتح اتصالاً TCP إلى بورت Votifier.

  • إدراجات Minecraft فقط
  • RSA كلاسيكي أو رمز NuVotifier v2
  • يلزم بورت مفتوح + قائمة سماح في الجدار الناري
Minecraft Votifier →

لـ Minecraft استخدم Votifier أولاً. HTTP postback اختياري (أو إضافي). يعمل كل قناة مفعّلة بشكل مستقل بعد التصويت.

بداية سريعة

  1. سجّل الدخول وافتح لوحة التحكم.
  2. عدّل إدراج السيرفر الموافق عليه.
  3. عيّن رابط Postback و/أو فعّل Votifier ضمن تفاصيل Minecraft.
  4. انسخ رابط التصويت التحفيزي من نموذج التعديل (ينتهي بـ ?p=USERNAME).
  5. ضع الرابط على موقعك أو Discord؛ استبدل USERNAME لكل لاعب.
  6. أجرِ تصويتاً تجريبياً وتأكد من وصول المكافآت.
02

Postback PHP

بعد تصويت ناجح نطلب رابطك بمعامل اللاعب وعنوان IP الخاص به. يحدّد سكربتك أن الحساب صوّت ويمنح نقاطاً أو عناصر.

أضف عنوان IP الصادر العام لهذا الموقع إلى whitelist في الجدار الناري وسكربت postback. ارفض أي مصدر آخر. فضّل HTTPS.

1. عيّن رابط Postback

لوحة التحكم ← تعديل السيرفر ← مكافآت التصويت ← رابط Postback.

https://YOURDOMAIN/postback.php
  • اسم الملف اختياري — استخدم أي مسار يناسب بنيتك.
  • تُقبل فقط روابط http/https العامة. تُرفض عناوين localhost وشبكات LAN الخاصة وبيانات الاعتماد في الرابط (حماية SSRF).
  • نتبع عدداً محدوداً من التحويلات وننتهي بعد بضع ثوانٍ ليبقى التصويت سريعاً.

2. ابنِ روابط تصويت تحفيزية

أضف معاملاً ليُعرَّف كل لاعب عند وصوله لصفحة التصويت.

/GAME/server/SLUG/vote?p=PARAMETER
الجزء القواعد
PARAMETER / p_resp أحرف وأرقام و_ و- فقط · بحد أقصى 32 حرفاً · اسم مستخدم أو معرّف حساب أو أي معرّف تتابعه
ip IPv4 أو IPv6 للمصوّت كما تراه هذه القائمة (مع مراعاة البروكسي عند التفعيل)
استعلام التعبئة المسبقة ?p= أو ?username=

3. ما نستدعيه بعد التصويت

عند النجاح فقط. إن لم يُكمل اللاعب تصويتاً صالحاً، لا نرسل طلباً.

https://YOURDOMAIN/postback.php?p_resp=PARAMETER&ip=USERIP
رابط تحفيزي استدعاؤنا
/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 بـ p_resp=Razor، يكون اللاعب Razor قد صوّت. قيمة ip هي العنوان الذي استخدمه في هذه القائمة.

ما يجب أن يفعله سكربتك

  • تحقّق من أن الطلب يأتي من عنوان IP العام لهذه القائمة.
  • نظّف p_resp وip (لا تثق بالمدخلات الخام أبداً).
  • تأكد من وجود الحساب / الشخصية في قاعدة بياناتك.
  • طبّق فترة انتظار مكافأة خاصة إن احتجت ما هو أشد من 24 ساعة.
  • امنح نقاطاً أو عملات أو عناصر؛ سجّل الحدث؛ أعد HTTP 200.

مثال postback.php

استضف هذا على موقع المكافآت، وليس بالضرورة على قائمة التصويت. عيّن VOTE_LIST_IP إلى عنوان IP الصادر العام لهذا الموقع قبل الإطلاق.

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

يمكننا دفع التصويت مباشرة إلى سيرفر Minecraft. ثم تشغّل إضافة الاستماع أوامر المكافأة.

الجدار الناري: اسمح بـ TCP وارد من عنوان IP العام لهذا الموقع إلى بورت Votifier (الافتراضي 8192). لا تعرض البورت للإنترنت بالكامل إن أمكن.

  1. يُدخل اللاعب اسم مستخدم Minecraft في صفحة التصويت (أو يصل عبر ?p=Steve).

  2. ينجح التصويت في هذه القائمة.

  3. نتصل بمضيف/بورت Votifier ونسلّم حزمة التصويت.

  4. يمنح المستمع صناديق أو مفاتيح أو أموالاً إلخ.

فعّل Votifier ضمن تفاصيل Minecraft، اختر NuVotifier v2 أو Classic، ثم أدخل المضيف والبورت والرمز أو مفتاح RSA العام.

ثبّت NuVotifier (RSA الكلاسيكي وبروتوكول v2) أو Votifier الكلاسيكي، مع مستمع لإصدار Minecraft لديك (GAListener أو SuperbVote أو مستمع مخصّص).

Classic / v1: الصق ملف public.key بالكامل. المضيف والبورت من config.yml. أبقِ debug: true أثناء الربط بهذه القائمة ثم عطّله.

host: YOUR_PUBLIC_IP
port: 8192
debug: true

تُعرّف الحزم هذه القائمة باسم: JoinGameServers

04

NuVotifier v2

بروتوكول v2 يستبدل RSA برمز مشترك وتحدٍّ لمرة واحدة. اربط رمزاً باسم خدمة هذه القائمة، أو استخدم الرمز الافتراضي.

tokens:
  default: REPLACE_WITH_DEFAULT_TOKEN
  "JoinGameServers": REPLACE_WITH_LIST_TOKEN

صيغة الإرسال: اتصال TCP ← قراءة الترحيب VOTIFIER 2 <challenge> ← حمولة JSON (username وserviceName وtimestamp بالمللي ثانية وaddress وchallenge) ← Base64(HMAC-SHA256(payload, token)) ← magic 0x733A + الطول + JSON {signature, payload}. توقَّع {"status":"ok"}.

العَرَض السبب المحتمل
ليس سيرفر NuVotifier v2 الترحيب بلا تحدٍّ — استخدم Classic أو رقِّ NuVotifier وفعّل v2.
توقيع غير صالح / خدمة غير معروفة رمز خاطئ أو اسم الخدمة غير مربوط. أضف اسم خدمة القائمة أو استخدم الافتراضي.
فشل الاتصال / انتهاء المهلة مضيف/بورت خاطئ أو Votifier متوقف أو الجدار الناري يحجب IP هذه القائمة.
لا استجابة تداخل بروكسي/إضافة؛ فعّل تصحيح NuVotifier وأعد المحاولة.
05

قائمة اختبار

  1. احفظ إعدادات الإدراج دون أخطاء تحقق.
  2. افتح رابطاً تحفيزياً — يجب أن يُملأ حقل اسم المستخدم من ?p=.
  3. أدلِ بصوت واحد. يجب أن ترى حالة النجاح. يُحظر تصويت ثانٍ خلال 24 ساعة.
  4. تحقّق من postback: فعّل DEBUG في المستقبِل؛ تأكد من وصول p_resp وip.
  5. تحقّق من Votifier: مع debug true يجب أن تظهر وحدة تحكم Minecraft تصويتاً وارداً باسمك واسم خدمة هذه القائمة.
  6. تأكد من وصول المكافأة داخل اللعبة أو على الموقع. إن لم تصل، أصلح المستمع — تصويت القائمة يبقى محتسباً.

تُسجَّل محاولات التسليم في vote_reward_logs (ok / fail / skipped). فشل الاستدعاء لا يتراجع عن التصويت في هذه القائمة أبداً.

06

الأسئلة الشائعة واستكشاف الأخطاء

لا. يمكن للزوار التصويت. الحسابات المسجّلة تخضع لنفس قواعد الانتظار 24 ساعة لمنع الإساءة.

إذا أعددت رابط postback أو Votifier، نحتاج معاملاً لنخبرك بمن تكافئ. بدون مكافآت مُعدّة يبقى اسم المستخدم اختيارياً.

نعم. يعملان بعد تصويت ناجح. الإخفاقات مستقلة.

يجب أن يكون رابط http(s) عاماً. تُحظر عناوين localhost و.local وIP الخاصة (مثل 10.* و192.168.*) والروابط ببيانات اعتماد مضمّنة.

تأكد من نجاح التصويت في هذه القائمة. راجع سجلات postback أو مخرجات تصحيح NuVotifier. تحقّق من قوائم سماح الجدار الناري ومن تطابق اسم المستخدم مع حساب داخل اللعبة. انتظار القائمة 24 ساعة؛ قد يختلف انتظار مكافأتك.

فقط A–Z وa–z و0–9 و_ و-. يُزال أي شيء آخر. ابقِ المعاملات ≤ 32 حرفاً.