المهام اليومية والأسبوعية — سبب يدفعك للعودة
كل مباراة تنتهي تحرّك الآن مجموعة من المهام اليومية والأسبوعية، وتمنحك نقاط الخبرة لحظة إكمال أيّ منها، وتغذّي لوحة صدارة أسبوعية جديدة.

بكلمات بسيطة
حتى الآن كان التقدّم الوحيد في opolyx مكافأة لمرّة واحدة عند الفوز بمباراة. لم يكن هناك ما تسعى إليه يومًا بعد يوم. المهام تغيّر ذلك: مجموعة صغيرة من الأهداف اليومية والأسبوعية تتقدّم في كل مرة تنهي فيها مباراة (باستثناء المباريات التي تنتهي مبكرًا)، فزت أم خسرت.
لا تطالب بأي شيء ولا يوجد زر تضغطه — في اللحظة التي تنتهي فيها المباراة، يفحص الخادم مهامك، ويحتسب ما أكملته منها، ويضيف نقاط الخبرة مباشرة إلى مستواك. كانت ست مهام تعمل عند الإطلاق:
- يومية — العب مباراة واحدة، والعب 3 مباريات، وافز بمباراة واحدة.
- أسبوعية — العب 10 مباريات، وافز بـ 3 مباريات، والعب 3 مباريات بوضع «سريعة».
- تُعاد المهام اليومية كل يوم؛ وتُعاد المهام الأسبوعية كل يوم اثنين.
| المهمة | الوتيرة | الهدف | المكافأة |
|---|---|---|---|
| العب مباراة | يومية | 1 | +50 نقطة خبرة |
| واصِل اللعب | يومية | 3 | +150 نقطة خبرة |
| افز بمباراة | يومية | 1 | +250 نقطة خبرة |
| منتظم | أسبوعية | 10 مباريات | +400 نقطة خبرة |
| في سلسلة انتصارات | أسبوعية | 3 انتصارات | +600 نقطة خبرة |
| شيطان السرعة | أسبوعية | 3 مباريات بوضع «سريعة» | +500 نقطة خبرة |
إنهاء المباريات كان يكسبك أيضًا نقاطًا في لوحة الصدارة الأسبوعية عند الإطلاق؛ ومنذ 12 أغسطس 2026 صارت اللوحة الأسبوعية ترتّب حسب الزيادة في التصنيف خلال الأسبوع. تُعاد اللوحة كل أسبوع، مانحةً الجميع فرصة متكافئة للوصول إلى القمة صباح كل اثنين.
للمهتمين بالتفاصيل التقنية
كان مخطّط حلقة الاستبقاء الكاملة موجودًا بالفعل لكنه ظلّ خاملًا وغير مقروء — missions / user_missions (الوتيرة، الهدف، التقدّم، xp_reward) وweekly_top (week_start، النقاط). الترحيل 0031 وصله بمسار مكافأة الإنهاء القائم بدلًا من ابتكار أي شيء جديد.
عند إنهاء حقيقي يمرّ الخادم (daemon) على كل لاعب بشري ويستدعي إجراء RPC واحدًا بصلاحية service-role. يقدّم كل مهمة يحقّقها الإنهاء في الدورة الحالية، ويمنح نقاط الخبرة أول مرة يُتجاوز فيها الهدف، ويضيف إلى مجموع النقاط الأسبوعي:
-- grant_play_rewards(p_game, p_user, p_won): security definer, service-role only
-- daily cadence = current_date; weekly = date_trunc('week', now())
-- weekly_top.points += 20 (play) + (won ? 200 : 0) + mission_xp_earned
-- idempotent per (game_id, user_id) via the game_play_grants guard; bots skipped| مطابقة الحدث | تُقدِّم | النقاط |
|---|---|---|
| {"event":"play"} | كل إنهاء | +20 |
| {"event":"win"} | الانتصارات فقط | +200 |
| {"event":"play","mode":"speed"} | مباريات «سريعة» فقط | +20 |
الحماية من التكرار هي صف حارس لكل (مباراة، مستخدم)، فلا يدفع الالتزام المُعاد مرتين أبدًا. ظهر فخّ لتصعيد الصلاحيات وقت التطبيق: صلاحيات Postgres الافتراضية تمنح EXECUTE على الدوال الجديدة لـ anon/authenticated، وrevoke … from public لا يزيل ذلك. دالة مكافأة بصلاحية SECURITY DEFINER يستطيع أي مستخدم مسجّل استدعاءها هي مزرعة لنقاط الخبرة — عولج ذلك بـ revoke … from public, anon, authenticated حتى لا يستطيع استدعاءها سوى {postgres, service_role}، مطابقةً لـ award_game_winner.
المكافآت نقاط خبرة فقط في الوقت الحالي — العملات تنتمي إلى مسار تحقيق الدخل الذي يحتاج أولًا إلى منفذ للإنفاق. تقرأ كلٌّ من لوحة صفحة اللعب ولوحة الصدارة تقدّم الدورة الحالية من جهة العميل، مع تثبيت الأسبوع على حدّ يوم الاثنين نفسه الذي يستخدمه Postgres حتى لا يختلفا أبدًا.
