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

بكلمات بسيطة
حتى الآن كان التقدّم الوحيد في opolyx مكافأة لمرّة واحدة عند الفوز بمباراة. لم يكن هناك ما تسعى إليه يومًا بعد يوم. المهام تغيّر ذلك: مجموعة صغيرة من الأهداف اليومية والأسبوعية تتقدّم في كل مرة تنهي فيها مباراة، فزت أم خسرت.
لا تطالب بأي شيء ولا يوجد زر تضغطه — في اللحظة التي تنتهي فيها المباراة، يفحص الخادم مهامك، ويحتسب ما أكملته منها، ويضيف نقاط الخبرة مباشرة إلى مستواك. تعمل ست مهام في آنٍ واحد:
- يومية — العب مباراة واحدة، والعب 3 مباريات، وافز بمباراة واحدة.
- أسبوعية — العب 10 مباريات، وافز بـ 3 مباريات، وافز بـ 3 مباريات في النمط السريع.
- تُعاد المهام اليومية كل يوم؛ وتُعاد المهام الأسبوعية كل يوم اثنين.
| المهمة | الوتيرة | الهدف | المكافأة |
|---|---|---|---|
| العب مباراة | يومية | 1 | +50 XP |
| واصِل اللعب | يومية | 3 | +120 XP |
| افز بمباراة | يومية | 1 | +150 XP |
| منتظم | أسبوعية | 10 مباريات | +300 XP |
| في سلسلة انتصارات | أسبوعية | 3 انتصارات | +400 XP |
| شيطان السرعة | أسبوعية | 3 انتصارات سريعة | +400 XP |
إنهاء المباريات يكسبك أيضًا نقاطًا في لوحة الصدارة الأسبوعية، فكلما لعبت أكثر ارتفعت أعلى. تُعاد اللوحة كل أسبوع، مانحةً الجميع فرصة نظيفة للوصول إلى القمة صباح كل اثنين.
للمهتمين بالتفاصيل التقنية
كان مخطّط حلقة الاستبقاء الكاملة موجودًا بالفعل لكنه ظلّ خاملًا وغير مقروء — 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 حتى لا يختلفا أبدًا.
