* feat(docs): mirror every docs/ page in all 65 locales Extends the documentation mirrors from the 22-page core set (#13940) to every Markdown page under docs/: 152 sources x 65 locales = 9,880 mirrors (6,208 new), language bars rewritten for the full locale list, state adopted so the blocking drift gate now covers all 152 pages. run-translation.mjs: an oversized block made only of table rows or list items (PROVIDER_REFERENCE.md 244-row table, FREE_TIERS.md 71-item list) is cut at item boundaries and rejoined without a blank line — the single 16-40 KB request outlived the backend socket for verbose scripts. 48 older mirrors whose tables had lost rows were retranslated with --force. * docs(i18n): refresh mirrors for the sources the base changed since the branch cut Section-level retranslation of the 29 docs (and README.md) whose source or mirrors moved on release/v3.8.51 during the run, then state adoption; the drift gate is green again on the merged tree.
85 KiB
Gamification & Leaderboard System (ଓଡ଼ିଆ)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
ସତ୍ୟର ମୂଳ ଉତ୍ସ:
src/lib/gamification/,src/lib/db/gamification.ts,src/app/api/gamification/ଶେଷ ଅଦ୍ୟତନ: 2026-06-28 — v3.8.40
OmniRoute ଏକ ସ୍ଥାନୀୟ-ପ୍ରଥମ ଗେମିଫିକେସନ୍ ସ୍ତର ଅନ୍ତର୍ଭୁକ୍ତ କରେ, ଯାହା ପ୍ଲାଟଫର୍ମ ସହିତ ସକ୍ରିୟ ଭାବେ ଯୋଡ଼ି ହେବା ପାଇଁ ବ୍ୟବହାରକାରୀଙ୍କୁ ପୁରସ୍କୃତ କରେ — ଅନୁରୋଧ କରିବା, ପ୍ରଦାନକାରୀ ବଦଳାଇବା, କମ୍ବୋ ସୃଷ୍ଟି କରିବା, ଟୋକେନ୍ ଅଂଶୀଦାର କରିବା ଏବଂ ସମୁଦାୟରେ ଅବଦାନ ଦେବା। ସମସ୍ତ ଅବସ୍ଥା SQLiteରେ ରହେ; ସମୁଦାୟ ସର୍ଭରଗୁଡ଼ିକ ସହିତ ଫେଡେରେସନ୍ ଇଚ୍ଛାଧୀନ ଏବଂ ପୁସ୍-ଆଧାରିତ।
ସିଷ୍ଟମ୍ଟି ହଟ୍ ପାଥ୍ରେ ଶୂନ୍ୟ-ବିଳମ୍ବ ପାଇଁ ଡିଜାଇନ୍ କରାଯାଇଛି — ଗେମିଫିକେସନ୍ ଇଭେଣ୍ଟଗୁଡ଼ିକ ଅନୁରୋଧ ପାଇପଲାଇନ୍ରୁ ଫାୟାର୍-ଆଣ୍ଡ୍-ଫରଗେଟ୍ ଭାବେ ପ୍ରେରିତ ହୁଏ ଏବଂ କେବେବି କୌଣସି LLM ପ୍ରତିକ୍ରିୟାକୁ ଅବରୋଧ କରେନାହିଁ।
ସାରାଂଶ
ଉଦ୍ଦେଶ୍ୟ
ଦୃଶ୍ୟମାନ ପ୍ରଗତି (XP, ସ୍ତର, ବ୍ୟାଜ୍), ସାମାଜିକ ପ୍ରମାଣ (ଲିଡର୍ବୋର୍ଡ୍) ଏବଂ ଆର୍ଥିକ ପ୍ରୋତ୍ସାହନ (ଟୋକେନ୍ ଅଂଶୀଦାରୀ, ଆମନ୍ତ୍ରଣ ପୁରସ୍କାର) ପ୍ରଦାନ କରି ବ୍ୟବହାରକାରୀଙ୍କ ସକ୍ରିୟତା ଓ ଧାରଣ ବୃଦ୍ଧି କରିବା।
ପରିସର
| ବୈଶିଷ୍ଟ୍ୟ | ବର୍ଣ୍ଣନା |
|---|---|
| XP ଓ ସ୍ତର | ପ୍ରତ୍ୟେକ କାର୍ଯ୍ୟ ପାଇଁ XP ଅର୍ଜନ କରନ୍ତୁ; ଏକ ପଲିନୋମିଆଲ୍ ବକ୍ର ଅନୁଯାୟୀ ସ୍ତର ବଢ଼ାନ୍ତୁ |
| ବ୍ୟାଜ୍ | 4ଟି ବିରଳତା ସ୍ତର ସହିତ 5ଟି ବର୍ଗରେ 20+ ସଫଳତା |
| ଷ୍ଟ୍ରିକ୍ | ବର୍ତ୍ତମାନ/ଦୀର୍ଘତମ ଷ୍ଟ୍ରିକ୍ ସହିତ ଦୈନିକ ସକ୍ରିୟ ବ୍ୟବହାର ଟ୍ରାକିଂ |
| ଲିଡର୍ବୋର୍ଡ୍ | ବିଶ୍ୱବ୍ୟାପୀ, ସାପ୍ତାହିକ, ମାସିକ, ଟୋକେନ୍-ଅଂଶୀଦାରୀ ଏବଂ ଅବଦାନ ପରିସର |
| ଟୋକେନ୍ ଅଂଶୀଦାରୀ | ଡବଲ୍-ଏଣ୍ଟ୍ରି ଲେଜର୍ ମାଧ୍ୟମରେ ବ୍ୟବହାରକାରୀଙ୍କ ମଧ୍ୟରେ କ୍ରେଡିଟ୍ ସ୍ଥାନାନ୍ତର କରନ୍ତୁ |
| ଆମନ୍ତ୍ରଣ ଓ ରିଡିମ୍ | SHA-256 ହ୍ୟାସ୍ଯୁକ୍ତ ସଂରକ୍ଷଣ ସହିତ ରେଫରାଲ୍ କୋଡ୍ |
| ସମୁଦାୟ ସର୍ଭରଗୁଡ଼ିକ | ବାହ୍ୟ OmniRoute ଇନ୍ଷ୍ଟାନ୍ସଗୁଡ଼ିକ ସହିତ ଫେଡେରେଟ୍ କରନ୍ତୁ |
| ଠକେଇ-ବିରୋଧୀ | ସର୍ଭର୍-ପାର୍ଶ୍ୱ ସ୍କୋରିଂ, ହାର ସୀମିତକରଣ, z-score ବିସଙ୍ଗତି ଚିହ୍ନଟ |
ଡିଜାଇନ୍ ନୀତି
- ସ୍ଥାନୀୟ-ପ୍ରଥମ — ସମସ୍ତ ଅବସ୍ଥା SQLiteରେ, କୌଣସି ବାହ୍ୟ ସେବା ଆବଶ୍ୟକ ନାହିଁ।
- ଅବରୋଧହୀନ — ଇଭେଣ୍ଟଗୁଡ଼ିକ ଫାୟାର୍-ଆଣ୍ଡ୍-ଫରଗେଟ୍; LLM ପ୍ରତିକ୍ରିୟା ପଥ ଗେମିଫିକେସନ୍ ଯୁକ୍ତି ଦ୍ୱାରା କେବେବି ବିଳମ୍ବିତ ହୁଏନାହିଁ।
- ସର୍ଭର୍-କର୍ତ୍ତୃତ୍ୱାଧୀନ — XP କେବଳ ସର୍ଭର୍ ପାର୍ଶ୍ୱରେ ଗଣନା କରାଯାଏ; କ୍ଲାଏଣ୍ଟଗୁଡ଼ିକ ସ୍କୋର୍ କୃତ୍ରିମ ଭାବେ ବଢ଼ାଇ ପାରିବେନାହିଁ।
- ଗୋପନୀୟତାକୁ ସମ୍ମାନ କରୁଥିବା — ଲିଡର୍ବୋର୍ଡ୍ରେ ଅଂଶଗ୍ରହଣ ଇଚ୍ଛାଧୀନ; ବ୍ୟବହାରକାରୀମାନେ ସେମାନଙ୍କ ପ୍ରୋଫାଇଲ୍ ଲୁଚାଇ ପାରିବେ।
- ଫେଡେରେସନ୍-ପ୍ରସ୍ତୁତ — ସମୁଦାୟ ସର୍ଭରଗୁଡ଼ିକ ସ୍ୱାକ୍ଷରିତ API ମାଧ୍ୟମରେ ସ୍କୋର୍ ପୁସ୍ କରିପାରିବେ; ସିଙ୍କ୍ ଓଭର୍ରାଇଟ୍ କରେ, ଯୋଗ କରେନାହିଁ।
ସ୍ଥାପତ୍ୟ
ଉଚ୍ଚ-ସ୍ତରୀୟ ପ୍ରବାହ
କ୍ଲାଏଣ୍ଟ ଅନୁରୋଧ
→ /v1/chat/completions
→ handleChatCore() [open-sse/handlers/chatCore.ts]
→ ... (ବିଦ୍ୟମାନ ପାଇପଲାଇନ୍) ...
→ ଅପ୍ଷ୍ଟ୍ରିମ୍ ପ୍ରତିକ୍ରିୟା କ୍ଲାଏଣ୍ଟକୁ ପଠାଗଲା
→ setImmediate (ଫାୟାର୍-ଆଣ୍ଡ୍-ଫରଗେଟ୍):
→ emitGamificationEvent() [src/lib/gamification/events.ts]
→ awardXp() [src/lib/gamification/xp.ts]
→ updateStreak() [src/lib/gamification/streaks.ts]
→ evaluateBadges() [src/lib/gamification/badges.ts]
→ updateLeaderboard() [src/lib/gamification/leaderboard.ts]
→ checkAnomalies() [src/lib/gamification/antiCheat.ts]
ଇଭେଣ୍ଟ ଇମିଟର୍ ହେଉଛି ଏକମାତ୍ର ସମନ୍ୱୟ ବିନ୍ଦୁ। ପ୍ରତିକ୍ରିୟା ପଠାଯିବା ପରେ chatCore.ts
emitGamificationEvent()କୁ କଲ୍ କରେ; ଇଭେଣ୍ଟ ମଡ୍ୟୁଲ୍ XP, ଷ୍ଟ୍ରିକ୍, ବ୍ୟାଜ୍,
ଲିଡର୍ବୋର୍ଡ୍ ଏବଂ ଠକେଇ-ବିରୋଧୀ ଉପସିଷ୍ଟମ୍ଗୁଡ଼ିକୁ ଇଭେଣ୍ଟ ବିତରଣ କରେ।
ମଡ୍ୟୁଲ୍ ନିର୍ଭରଶୀଳତା ଗ୍ରାଫ୍
src/lib/gamification/
events.ts ← ପ୍ରବେଶ ବିନ୍ଦୁ (chatCore.tsରୁ କଲ୍ କରାଯାଏ)
├── xp.ts ← XP ଗଣନା ଏବଂ ସ୍ତର ନିର୍ଦ୍ଧାରଣ
├── streaks.ts ← ଦୈନିକ ସକ୍ରିୟ ଷ୍ଟ୍ରିକ୍ ଟ୍ରାକିଂ
├── badges.ts ← ବ୍ୟାଜ୍ ମାନଦଣ୍ଡ ମୂଲ୍ୟାଙ୍କନ
├── leaderboard.ts ← ର୍ୟାଙ୍କ୍ ଗଣନା ଏବଂ SSE ପ୍ରସାରଣ
├── antiCheat.ts ← ହାର ସୀମିତକରଣ ଏବଂ ବିସଙ୍ଗତି ଚିହ୍ନଟ
├── sharing.ts ← ଟୋକେନ୍ ସ୍ଥାନାନ୍ତର ଲେଜର୍
├── invites.ts ← ଆମନ୍ତ୍ରଣ/ରିଡିମ୍ କୋଡ୍ ପରିଚାଳନା
├── servers.ts ← ସମୁଦାୟ ସର୍ଭର୍ ଫେଡେରେସନ୍
└── notifications.ts ← SSE ବିଜ୍ଞପ୍ତି ଷ୍ଟ୍ରିମ୍
src/lib/db/
gamification.ts ← ସମସ୍ତ CRUD କାର୍ଯ୍ୟ (8ଟି ଟେବୁଲ୍)
src/app/api/gamification/
leaderboard/ ← GET ର୍ୟାଙ୍କିଂ, POST ମାନୁଆଲ୍ ରିଫ୍ରେଶ୍
leaderboard/stream ← SSE ବାସ୍ତବ-ସମୟ ଅଦ୍ୟତନ
transfer/ ← GET ଇତିହାସ, POST ଟୋକେନ୍ ପଠାନ୍ତୁ
invite/ ← GET/POST କୋଡ୍, DELETE ପ୍ରତ୍ୟାହାର
invite/redeem/ ← POST ଏକ କୋଡ୍ ରିଡିମ୍ କରନ୍ତୁ
servers/ ← GET/POST/DELETE ସମୁଦାୟ ସର୍ଭରଗୁଡ଼ିକ
federation/score/ ← POST ସର୍ଭରକୁ ସ୍କୋର୍ ପୁସ୍ କରନ୍ତୁ
federation/leaderboard/ ← GET ସର୍ଭରରୁ ଲିଡର୍ବୋର୍ଡ୍ ପୁଲ୍ କରନ୍ତୁ
notifications/ ← SSE ବ୍ୟାଜ୍/ସ୍ତର-ବୃଦ୍ଧି ବିଜ୍ଞପ୍ତି
anomalies/ ← GET ବିସଙ୍ଗତି ରିପୋର୍ଟଗୁଡ଼ିକ (ପ୍ରଶାସକ)
rotate/ ← POST ଆମନ୍ତ୍ରଣ ଟୋକେନ୍ ସିକ୍ରେଟ୍ଗୁଡ଼ିକୁ ଘୂର୍ଣ୍ଣନ କରନ୍ତୁ
ଡାଟା ସ୍ତର
ଡାଟାବେସ୍ ଟେବୁଲ୍ଗୁଡ଼ିକ
ସମସ୍ତ ଟେବୁଲ୍ ମୁଖ୍ୟ OmniRoute SQLite ଡାଟାବେସ୍ରେ ରହିଛି, ଯାହା
060_create_gamification.sql ମାଇଗ୍ରେସନ୍ ଦ୍ୱାରା ସୃଷ୍ଟି ହୋଇଛି। WAL ଜର୍ଣ୍ଣାଲିଂ src/lib/db/core.tsରେ ଥିବା
ସିଙ୍ଗଲଟନ୍ getDbInstance()ରୁ ଉତ୍ତରାଧିକାରରେ ମିଳେ।
┌─────────────────────────┐ ┌──────────────────────────┐
│ leaderboard │ │ user_levels │
├─────────────────────────┤ ├──────────────────────────┤
│ id TEXT PK │ │ api_key_id TEXT PK │
│ api_key_id TEXT │ │ xp INTEGER │
│ scope TEXT │ │ level INTEGER │
│ score INTEGER │ │ title TEXT │
│ period TEXT │ │ updated_at TEXT │
│ updated_at TEXT │ └──────────────────────────┘
└─────────────────────────┘
│
│ 1:N
▼
┌─────────────────────────┐ ┌──────────────────────────┐
│ user_badges │ │ badge_definitions │
├─────────────────────────┤ ├──────────────────────────┤
│ id TEXT PK │ │ id TEXT PK │
│ api_key_id TEXT │ │ name TEXT │
│ badge_id TEXT FK │ │ category TEXT │
│ earned_at TEXT │ │ rarity TEXT │
│ notified INTEGER │ │ criteria_type TEXT │
└─────────────────────────┘ │ criteria TEXT(JSON) │
│ description TEXT │
│ icon TEXT │
│ hidden INTEGER │
└──────────────────────────┘
┌─────────────────────────┐ ┌──────────────────────────┐
│ xp_audit_log │ │ token_ledger │
├─────────────────────────┤ ├──────────────────────────┤
│ id TEXT PK │ │ id TEXT PK │
│ api_key_id TEXT │ │ from_key_id TEXT │
│ action TEXT │ │ to_key_id TEXT │
│ xp_awarded INTEGER │ │ amount INTEGER │
│ metadata TEXT(JSON)│ │ idempotency_key TEXT UQ │
│ created_at TEXT │ │ created_at TEXT │
└─────────────────────────┘ └──────────────────────────┘
┌─────────────────────────┐ ┌──────────────────────────┐
│ invite_tokens │ │ community_servers │
├─────────────────────────┤ ├──────────────────────────┤
│ id TEXT PK │ │ id TEXT PK │
│ api_key_id TEXT │ │ name TEXT │
│ code TEXT UQ │ │ url TEXT │
│ token_hash TEXT │ │ token_hash TEXT │
│ uses INTEGER │ │ status TEXT │
│ max_uses INTEGER │ │ last_sync TEXT │
│ created_at TEXT │ │ created_at TEXT │
│ expires_at TEXT │ └──────────────────────────┘
└─────────────────────────┘
ଡୋମେନ୍ ମଡ୍ୟୁଲ୍: src/lib/db/gamification.ts
ଏହା ମାନକ OmniRoute ପ୍ୟାଟର୍ନ ଅନୁସରଣ କରେ — core.tsରୁ getDbInstance() ଇମ୍ପୋର୍ଟ କରେ
ଏବଂ ଟାଇପ୍ଯୁକ୍ତ CRUD ଫଙ୍କସନ୍ଗୁଡ଼ିକ ଏକ୍ସପୋର୍ଟ କରେ। ରୁଟ୍ ହ୍ୟାଣ୍ଡଲର୍ଗୁଡ଼ିକରେ କୌଣସି କଞ୍ଚା SQL ନାହିଁ।
ମୁଖ୍ୟ ଫଙ୍କସନ୍ଗୁଡ଼ିକ:
| ଫଙ୍କସନ୍ | ବର୍ଣ୍ଣନା |
|---|---|
upsertLeaderboardEntry() |
(api_key_id, scope, period) ପାଇଁ ସ୍କୋର୍ ଯୋଡ଼ନ୍ତୁ କିମ୍ବା ଅପଡେଟ୍ କରନ୍ତୁ |
getLeaderboard() |
ପ୍ରଦତ୍ତ scope/period ପାଇଁ ପୃଷ୍ଠାଙ୍କିତ ର୍ୟାଙ୍କିଙ୍ଗ୍ |
getUserLevel() |
ବ୍ୟବହାରକାରୀ ସ୍ତର ରେକର୍ଡ ପ୍ରାପ୍ତ କରନ୍ତୁ କିମ୍ବା ସୃଷ୍ଟି କରନ୍ତୁ |
updateUserLevel() |
XP, ସ୍ତର ଏବଂ ଶୀର୍ଷକକୁ ପରମାଣବିକ ଭାବରେ ସେଟ୍ କରନ୍ତୁ |
getBadgeDefinitions() |
ସମସ୍ତ ବ୍ୟାଜ୍ ସଂଜ୍ଞା (ଇଚ୍ଛାନୁସାରେ ଫିଲ୍ଟର୍ କରାଯାଇପାରିବ) |
getUserBadges() |
ଜଣେ ବ୍ୟବହାରକାରୀ ଅର୍ଜନ କରିଥିବା ବ୍ୟାଜ୍ଗୁଡ଼ିକ |
awardBadge() |
ବ୍ୟାଜ୍ ଅର୍ଜନ ରେକର୍ଡ ଯୋଡ଼ନ୍ତୁ (badge_id ଉପରେ ଇଡେମ୍ପୋଟେଣ୍ଟ) |
logXpAction() |
xp_audit_logରେ ସଂଯୋଜନ କରନ୍ତୁ |
getXpAuditLog() |
ଜଣେ ବ୍ୟବହାରକାରୀଙ୍କ ପାଇଁ ପୃଷ୍ଠାଙ୍କିତ ଅଡିଟ୍ ଇତିହାସ |
insertLedgerEntry() |
ଡବଲ୍-ଏଣ୍ଟ୍ରି ଟ୍ରାନ୍ସଫର୍ (ଟ୍ରାଞ୍ଜାକ୍ସନ୍ ମଧ୍ୟରେ) |
getBalance() |
ଜଣେ ବ୍ୟବହାରକାରୀଙ୍କ ପାଇଁ ପ୍ରାପ୍ତ ରାଶିରୁ ପ୍ରେରିତ ରାଶି ବିୟୋଗ କରି ମୋଟ ହିସାବ କରନ୍ତୁ |
getTransferHistory() |
ପୃଷ୍ଠାଙ୍କିତ ଟ୍ରାନ୍ସଫର୍ ଲଗ୍ |
createInviteToken() |
ଆମନ୍ତ୍ରଣ କୋଡ୍ + ହ୍ୟାଶ୍ କରାଯାଇଥିବା ଟୋକେନ୍ ଯୋଡ଼ନ୍ତୁ |
redeemInviteToken() |
କୋଡ୍ ଦ୍ୱାରା ଖୋଜନ୍ତୁ, ବୈଧତା ଯାଞ୍ଚ କରନ୍ତୁ ଏବଂ ବ୍ୟବହାର ସଂଖ୍ୟା ବଢ଼ାନ୍ତୁ |
upsertCommunityServer() |
ଏକ ଫେଡେରେସନ୍ ସର୍ଭର୍ ପଞ୍ଜୀକରଣ କରନ୍ତୁ କିମ୍ବା ଅପଡେଟ୍ କରନ୍ତୁ |
getCommunityServers() |
ଜଣେ ବ୍ୟବହାରକାରୀଙ୍କ ସର୍ଭର୍ଗୁଡ଼ିକର ତାଲିକା ପ୍ରଦାନ କରନ୍ତୁ |
deleteCommunityServer() |
ଏକ ସର୍ଭର୍ ପଞ୍ଜୀକରଣ ଅପସାରଣ କରନ୍ତୁ |
XP / ସ୍ତର ପ୍ରଣାଳୀ
ଫାଇଲ୍: src/lib/gamification/xp.ts
ସ୍ତର ବକ୍ରରେଖା
ସ୍ତର nରେ ପହଞ୍ଚିବା ପାଇଁ ଆବଶ୍ୟକ XP ଏକ ବହୁପଦୀୟ ବକ୍ରରେଖା ଅନୁସରଣ କରେ:
xp_for_level(n) = floor(100 * n^1.5)
| ସ୍ତର | ପରବର୍ତ୍ତୀ ସ୍ତର ପାଇଁ XP | ସଞ୍ଚିତ XP | ଉପାଧି |
|---|---|---|---|
| 1 | 100 | 100 | ପ୍ରାରମ୍ଭକାରୀ |
| 5 | 1,118 | 2,415 | ପ୍ରାରମ୍ଭକାରୀ |
| 10 | 3,162 | 10,523 | ଅନ୍ୱେଷକ |
| 25 | 12,500 | 86,024 | ଅନ୍ୱେଷକ |
| 50 | 35,355 | 345,529 | ବିଶେଷଜ୍ଞ |
| 75 | 64,952 | 948,683 | ମାଷ୍ଟର୍ |
| 100 | 100,000 | 2,050,000 | କିମ୍ବଦନ୍ତୀ |
ଉପାଧିଗୁଡ଼ିକ
| ସ୍ତର ପରିସର | ଉପାଧି |
|---|---|
| 1 – 9 | ପ୍ରାରମ୍ଭକାରୀ |
| 10 – 24 | ଅନ୍ୱେଷକ |
| 25 – 49 | ବିଶେଷଜ୍ଞ |
| 50 – 74 | ମାଷ୍ଟର୍ |
| 75 – 100 | କିମ୍ବଦନ୍ତୀ |
XP ପୁରସ୍କାରଗୁଡ଼ିକ
| କାର୍ଯ୍ୟ | XP | ବର୍ଣ୍ଣନା |
|---|---|---|
request |
1 | OmniRoute ମାଧ୍ୟମରେ ରାଉଟ୍ କରାଯାଇଥିବା ପ୍ରତ୍ୟେକ API ଅନୁରୋଧ ପାଇଁ |
provider_switch |
5 | ଏକ ଭିନ୍ନ ପ୍ରଦାତାକୁ ପରିବର୍ତ୍ତନ କରିବା |
model_switch |
3 | ଏକ ଭିନ୍ନ ମଡେଲ୍କୁ ପରିବର୍ତ୍ତନ କରିବା |
combo_create |
10 | ଏକ ନୂତନ କମ୍ବୋ ସୃଷ୍ଟି କରିବା |
combo_use |
2 | ଏକ ଅନୁରୋଧ ପାଇଁ କମ୍ବୋ ବ୍ୟବହାର କରିବା |
token_share |
1 | ଅନ୍ୟ ଜଣେ ବ୍ୟବହାରକାରୀଙ୍କ ସହ ଅଂଶୀଦାର କରାଯାଇଥିବା ପ୍ରତ୍ୟେକ 1 000 ଟୋକନ୍ ପାଇଁ |
invite_redeem |
50 | ଏକ ନିମନ୍ତ୍ରଣ କୋଡ୍ ରିଡିମ୍ କରିବା |
daily_login |
5 | ଦୈନିକ ସକ୍ରିୟ ବ୍ୟବହାର (ଦିନକୁ ଥରେ) |
streak_bonus |
2 | ପ୍ରତ୍ୟେକ କ୍ରମାଗତ ଷ୍ଟ୍ରିକ୍ ଦିନ ପାଇଁ (ଷ୍ଟ୍ରିକ୍ ଦୈର୍ଘ୍ୟ ଦ୍ୱାରା ଗୁଣିତ) |
badge_unlock |
10 | ଏକ ବ୍ୟାଜ୍ ଅନଲକ୍ କରିବା |
ପୁରସ୍କାର ପ୍ରବାହ
export async function awardXp(
apiKeyId: string,
action: XpAction,
metadata?: Record<string, unknown>
): Promise<{ xp: number; level: number; title: string; levelUp: boolean }>;
- XP ପରିମାଣ ପାଇବାକୁ
XP_REWARDS[action]ଖୋଜନ୍ତୁ। checkRateLimit()ମାଧ୍ୟମରେ ପାସ୍ କରନ୍ତୁ (ଠକେଇ-ନିରୋଧୀ: ପ୍ରତି କୀ ପାଇଁ ସର୍ବାଧିକ 1000 XP/ମିନିଟ୍)।- ଏକ ଟ୍ରାଞ୍ଜାକ୍ସନ୍ ଖୋଲନ୍ତୁ:
- ବର୍ତ୍ତମାନର
user_levelsଧାଡ଼ି ପଢ଼ନ୍ତୁ। - XP ଯୋଗ କରନ୍ତୁ;
levelFromXp(totalXp)ମାଧ୍ୟମରେ ସ୍ତର ପୁନଃଗଣନା କରନ୍ତୁ। - ସ୍ତର ପରିବର୍ତ୍ତିତ ହୋଇଥିଲେ,
levelUp = trueସେଟ୍ କରନ୍ତୁ। user_levelsଧାଡ଼ି ଅପଡେଟ୍ କରନ୍ତୁ।xp_audit_logରେ ଇନ୍ସର୍ଟ୍ କରନ୍ତୁ।
- ବର୍ତ୍ତମାନର
- ଫଳାଫଳ ଫେରାନ୍ତୁ। କଲର୍ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକ ପରିଚାଳନା କରେ।
ସହାୟକ: levelFromXp(totalXp)
ସଞ୍ଚିତ XP totalXpକୁ ଅତିକ୍ରମ ନ କରିବା ପର୍ଯ୍ୟନ୍ତ xp_for_level(n) ଯୋଗ କରି ସ୍ତର 1..100 ମଧ୍ୟରେ ପୁନରାବୃତ୍ତି କରେ। ଯେଉଁ ସର୍ବୋଚ୍ଚ ସ୍ତରର ସୀମା ପୂରଣ ହୁଏ, ତାହା ଫେରାଏ।
ଏହା O(100) — ସ୍ତରଗୁଡ଼ିକ 100ରେ ସୀମିତ ଥିବାରୁ ଗ୍ରହଣୀୟ।
ବ୍ୟାଜ୍ ପ୍ରଣାଳୀ
ଫାଇଲ୍: src/lib/gamification/badges.ts
ବର୍ଗଗୁଡ଼ିକ
| ବର୍ଗ | ବର୍ଣ୍ଣନା | ଉଦାହରଣ ବ୍ୟାଜ୍ଗୁଡ଼ିକ |
|---|---|---|
usage |
ପରିମାଣ-ଆଧାରିତ ମାଇଲଖୁଣ୍ଟ | ପ୍ରଥମ ଅନୁରୋଧ, 1K ଅନୁରୋଧ, 100K |
sharing |
ଟୋକନ୍ ଅଂଶୀଦାରୀ ଏବଂ ରେଫରାଲ୍ | ପ୍ରଥମ ଅଂଶୀଦାରୀ, ଉଦାର (10ଟି ଅଂଶୀଦାରୀ) |
contribution |
ସମୁଦାୟ ସହଭାଗିତା | କମ୍ବୋ ସୃଷ୍ଟିକର୍ତ୍ତା, ପ୍ରଦାତା ଅନ୍ୱେଷକ |
streak |
ସମୟ ସହିତ ନିରନ୍ତରତା | ସାପ୍ତାହିକ ଯୋଦ୍ଧା, ମାସିକ ସମର୍ପିତ |
rare |
ପାଇବାକୁ କଷ୍ଟକର କିମ୍ବା ଲୁକ୍କାୟିତ ସଫଳତା | ପ୍ରାରମ୍ଭିକ ଗ୍ରହଣକାରୀ, ବଗ୍ ରିପୋର୍ଟର୍ |
ଦୁର୍ଲଭତାଗୁଡ଼ିକ
| ଦୁର୍ଲଭତା | ରଙ୍ଗ | ସମ୍ଭାବନା ସଙ୍କେତ |
|---|---|---|
common |
ଧୂସର | ଅଧିକାଂଶ ବ୍ୟବହାରକାରୀ |
uncommon |
ସବୁଜ | ସକ୍ରିୟ ବ୍ୟବହାରକାରୀ |
rare |
ନୀଳ | ସମର୍ପିତ ବ୍ୟବହାରକାରୀ |
legendary |
ସୁନେଲି | ଶୀର୍ଷ 1% |
ମାନଦଣ୍ଡ ପ୍ରକାରଗୁଡ଼ିକ
| ପ୍ରକାର | ଫିଲ୍ଡ | ବର୍ଣ୍ଣନା |
|---|---|---|
action_count |
count |
କାର୍ଯ୍ୟକୁ N ଥର ସମ୍ପାଦନ କରନ୍ତୁ (ଯଥା, 1000ଟି ଅନୁରୋଧ) |
streak |
days |
N କ୍ରମାଗତ ଦିନ ପାଇଁ ଷ୍ଟ୍ରିକ୍ ବଜାୟ ରଖନ୍ତୁ |
unique_count |
field, n |
Nଟି ଅନନ୍ୟ ମୂଲ୍ୟ ବ୍ୟବହାର କରନ୍ତୁ (ଯଥା, 10ଟି ଭିନ୍ନ ମଡେଲ୍) |
rank |
scope, n |
ଏକ ଲିଡର୍ବୋର୍ଡ ସ୍କୋପ୍ରେ N ର୍ୟାଙ୍କରେ ପହଞ୍ଚନ୍ତୁ |
first |
— | ଏକ କାର୍ଯ୍ୟ ସମ୍ପାଦନ କରିବାରେ ପ୍ରଥମ ହୁଅନ୍ତୁ |
hidden |
(ଭିନ୍ନ ହୁଏ) | ଅର୍ଜନ ନହେବା ପର୍ଯ୍ୟନ୍ତ ମାନଦଣ୍ଡ ଦେଖାଯାଏ ନାହିଁ |
ବ୍ୟାଜ୍ ସଂଜ୍ଞାଗୁଡ଼ିକ badge_definitionsରେ JSON criteria ଭାବେ ସଂରକ୍ଷିତ ହୁଏ:
{
"type": "action_count",
"action": "request",
"count": 1000
}
ମୂଲ୍ୟାଙ୍କନ ପ୍ରବାହ
emitGamificationEvent(event)
→ evaluateBadges(apiKeyId, event)
→ getBadgeDefinitions() # ସମସ୍ତ ସଂଜ୍ଞା
→ getUserBadges(apiKeyId) # ପୂର୍ବରୁ ଅର୍ଜିତ (ଛାଡ଼ନ୍ତୁ)
→ ପ୍ରତ୍ୟେକ ଅନର୍ଜିତ ବ୍ୟାଜ୍ ପାଇଁ:
→ matchesCriteria(badge, event, userState)
→ ମେଳ ହେଲେ: awardBadge(apiKeyId, badgeId)
→ ବିଜ୍ଞପ୍ତି ପେଲୋଡ୍ ଫେରାନ୍ତୁ
ମୂଲ୍ୟାଙ୍କନ ଇଭେଣ୍ଟ-ଚାଳିତ — ଏହା ପ୍ରତ୍ୟେକ ଗେମିଫିକେସନ୍ ଇଭେଣ୍ଟ ପରେ ଚାଲେ, କିନ୍ତୁ କେବଳ ସେହି ବ୍ୟାଜ୍ଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରେ ଯାହାର criteria.type ଇଭେଣ୍ଟ କାର୍ଯ୍ୟ ସହିତ ସମନ୍ୱିତ। ଏହା ମୂଲ୍ୟାଙ୍କନକୁ ଦ୍ରୁତ ରଖେ (ଅଧିକାଂଶ ଇଭେଣ୍ଟ ପାଇଁ < 5ms)।
matchesCriteria(badge, event, userState)
| ମାନଦଣ୍ଡ ପ୍ରକାର | ଯାଞ୍ଚ |
|---|---|
action_count |
getActionCount(apiKeyId, action) >= count |
streak |
getCurrentStreak(apiKeyId) >= days |
unique_count |
getUniqueCount(apiKeyId, field) >= n |
rank |
getRank(apiKeyId, scope) <= n |
first |
ଏହି କାର୍ଯ୍ୟ ପ୍ରକାର ପାଇଁ କୌଣସି ପୂର୍ବ xp_audit_log ଏଣ୍ଟ୍ରି ନାହିଁ |
hidden |
ଉପଯୁକ୍ତ ଉପ-ଯାଞ୍ଚକୁ ନ୍ୟସ୍ତ କରେ |
ବିଲ୍ଟ-ଇନ୍ ବ୍ୟାଜ୍ଗୁଡ଼ିକ (20+)
ସମ୍ପୂର୍ଣ୍ଣ ବ୍ୟାଜ୍ ତାଲିକା
| ବ୍ୟାଜ୍ | ବର୍ଗ | ବିରଳତା | ମାନଦଣ୍ଡ |
|---|---|---|---|
| ପ୍ରଥମ ପଦକ୍ଷେପ | ବ୍ୟବହାର | ସାଧାରଣ | 1ଟି ଅନୁରୋଧ |
| ଆରମ୍ଭିକ ଅଭ୍ୟାସ | ବ୍ୟବହାର | ସାଧାରଣ | 100ଟି ଅନୁରୋଧ |
| ଶକ୍ତିଶାଳୀ ବ୍ୟବହାରକାରୀ | ବ୍ୟବହାର | ଅସାଧାରଣ | 1,000ଟି ଅନୁରୋଧ |
| ସେଞ୍ଚୁରିଅନ୍ | ବ୍ୟବହାର | ବିରଳ | 10,000ଟି ଅନୁରୋଧ |
| ଓମ୍ନିପାୱାର୍ | ବ୍ୟବହାର | କିମ୍ବଦନ୍ତୀୟ | 100,000ଟି ଅନୁରୋଧ |
| ପ୍ରଦାତା ପରିବର୍ତ୍ତନକାରୀ | ଅବଦାନ | ସାଧାରଣ | 5ଟି ଭିନ୍ନ ପ୍ରଦାତା ବ୍ୟବହାର କରନ୍ତୁ |
| ପ୍ରଦାତା ବିଶେଷଜ୍ଞ | ଅବଦାନ | ଅସାଧାରଣ | 20ଟି ଭିନ୍ନ ପ୍ରଦାତା ବ୍ୟବହାର କରନ୍ତୁ |
| କମ୍ବୋ ସ୍ଥପତି | ଅବଦାନ | ଅସାଧାରଣ | 5ଟି କମ୍ବୋ ସୃଷ୍ଟି କରନ୍ତୁ |
| କମ୍ବୋ ଗ୍ରାଣ୍ଡମାଷ୍ଟର୍ | ଅବଦାନ | ବିରଳ | 25ଟି କମ୍ବୋ ସୃଷ୍ଟି କରନ୍ତୁ |
| ପ୍ରଥମ ଅଂଶୀଦାରୀ | ଅଂଶୀଦାରୀ | ସାଧାରଣ | 1ଟି ଟୋକେନ୍ ସ୍ଥାନାନ୍ତର |
| ଉଦାର | ଅଂଶୀଦାରୀ | ଅସାଧାରଣ | 10ଟି ଟୋକେନ୍ ସ୍ଥାନାନ୍ତର |
| ପରୋପକାରୀ | ଅଂଶୀଦାରୀ | ବିରଳ | ମୋଟ 10,000ଟି ଟୋକେନ୍ ସ୍ଥାନାନ୍ତର କରନ୍ତୁ |
| ସୁପାରିସକାରୀ | ଅଂଶୀଦାରୀ | ସାଧାରଣ | 1ଟି ସଫଳ ସୁପାରିସ |
| ନେଟୱର୍କ ନିର୍ମାତା | ଅଂଶୀଦାରୀ | ଅସାଧାରଣ | 10ଟି ସଫଳ ସୁପାରିସ |
| ସାପ୍ତାହିକ ଯୋଦ୍ଧା | ଧାରାବାହିକତା | ଅସାଧାରଣ | 7-ଦିନର ଧାରାବାହିକତା |
| ମାସିକ ନିଷ୍ଠାବାନ୍ | ଧାରାବାହିକତା | ବିରଳ | 30-ଦିନର ଧାରାବାହିକତା |
| ଅପରାଜେୟ | ଧାରାବାହିକତା | କିମ୍ବଦନ୍ତୀୟ | 365-ଦିନର ଧାରାବାହିକତା |
| ପ୍ରାରମ୍ଭିକ ଗ୍ରହଣକାରୀ | ବିରଳ | କିମ୍ବଦନ୍ତୀୟ | ବିଟା ଅବଧିରେ ଯୋଗ ଦିଅନ୍ତୁ |
| ସଂକୋଚନ ଅଗ୍ରଦୂତ | ବିରଳ | ଅସାଧାରଣ | ସଂକୋଚନକୁ 100ଥର ବ୍ୟବହାର କରନ୍ତୁ |
| ଦକ୍ଷତା ସଂଗ୍ରାହକ | ବିରଳ | ବିରଳ | 10ଟି ଭିନ୍ନ ଦକ୍ଷତା ବ୍ୟବହାର କରନ୍ତୁ |
| ମଡେଲ୍ ଅନ୍ୱେଷକ | ଅବଦାନ | ଅସାଧାରଣ | 15ଟି ଭିନ୍ନ ମଡେଲ୍ ବ୍ୟବହାର କରନ୍ତୁ |
ଷ୍ଟ୍ରିକ୍ ଟ୍ରାକର୍
ଫାଇଲ୍: src/lib/gamification/streaks.ts
ଡାଟା ମଡେଲ୍
ଷ୍ଟ୍ରିକ୍ଗୁଡ଼ିକୁ ନେମସ୍ପେସ୍ଯୁକ୍ତ କୀ ଅଧୀନରେ key_value ଟେବୁଲ୍ରେ (ସହଭାଗୀ ୟୁଟିଲିଟି ଟେବୁଲ୍) ସଂରକ୍ଷଣ କରାଯାଏ:
| କୀ | ମୂଲ୍ୟ | ବର୍ଣ୍ଣନା |
|---|---|---|
gamification:streak:{keyId} |
{current},{longest},{lastDate} |
ସକ୍ରିୟ ଷ୍ଟ୍ରିକ୍ ଡାଟା |
ଲଜିକ୍
export async function updateStreak(
apiKeyId: string
): Promise<{ current: number; longest: number; milestone: boolean }>;
key_valueରୁ ଷ୍ଟ୍ରିକ୍ ରେକର୍ଡ ପଢ଼ନ୍ତୁ।{current},{longest},{lastDate}(ISO ତାରିଖ ଷ୍ଟ୍ରିଙ୍ଗ୍) ପାର୍ସ କରନ୍ତୁ।- ଯଦି
lastDate === today— କୌଣସି ପରିବର୍ତ୍ତନ ନାହିଁ (ଆଜି ପାଇଁ ପୂର୍ବରୁ ଗଣନା କରାଯାଇଛି)। - ଯଦି
lastDate === yesterday—currentବୃଦ୍ଧି କରନ୍ତୁ; ଆବଶ୍ୟକ ହେଲେlongestଅଦ୍ୟତନ କରନ୍ତୁ। - ଯଦି
lastDate < yesterday—current = 1ଭାବେ ରିସେଟ୍ କରନ୍ତୁ (ଷ୍ଟ୍ରିକ୍ ଭାଙ୍ଗିଗଲା)। - ଅଦ୍ୟତିତ ରେକର୍ଡ ଲେଖନ୍ତୁ।
- ମାଇଲ୍ଷ୍ଟୋନ୍ଗୁଡ଼ିକ ଯାଞ୍ଚ କରନ୍ତୁ: 7, 14, 30, 60, 90, 180, 365 ଦିନ। ଅତିକ୍ରମ କରିଥିଲେ,
milestone = trueସେଟ୍ କରନ୍ତୁ (କଲର୍ XP ପ୍ରଦାନ କରେ ଏବଂ ବ୍ୟାଜ୍ ଯାଞ୍ଚ କରେ)।
ବିଶେଷ ପରିସ୍ଥିତି
- ସମୟ ମଣ୍ଡଳ: ଷ୍ଟ୍ରିକ୍ଗୁଡ଼ିକ UTC ତାରିଖ (
new Date().toISOString().slice(0, 10)) ବ୍ୟବହାର କରନ୍ତି। ଏହା ଉଦ୍ଦେଶ୍ୟମୂଳକ — ଗୋଟିଏ ମାନକ ସମୟ ମଣ୍ଡଳ, ସମୟ ମଣ୍ଡଳ ବଦଳାଇ ବ୍ୟବସ୍ଥାର ଅନୁଚିତ ଲାଭ ନେବାକୁ ପ୍ରତିରୋଧ କରେ। - ନୂଆ ବ୍ୟବହାରକାରୀ: କୌଣସି ଷ୍ଟ୍ରିକ୍ ରେକର୍ଡ ନଥାଏ; ପ୍ରଥମ ଅନୁରୋଧ
current=1, longest=1, lastDate=todayସହିତ ଏହାକୁ ସୃଷ୍ଟି କରେ। - ଦିନକୁ ଏକାଧିକ ଅନୁରୋଧ: UTC ଦିନର କେବଳ ପ୍ରଥମ ଅନୁରୋଧଟି ଷ୍ଟ୍ରିକ୍ ବୃଦ୍ଧି କରେ।
ଲିଡର୍ବୋର୍ଡ
ଫାଇଲ୍: src/lib/gamification/leaderboard.ts
ପରିସର
| ପରିସର | ଅବଧି | ବର୍ଣ୍ଣନା |
|---|---|---|
global |
all |
ସର୍ବକାଳୀନ ସଞ୍ଚିତ XP |
weekly |
week |
ବର୍ତ୍ତମାନର UTC ସପ୍ତାହରେ (ସୋମ-ରବି) ଅର୍ଜିତ XP |
monthly |
month |
ବର୍ତ୍ତମାନର UTC ମାସରେ ଅର୍ଜିତ XP |
tokens_shared |
all |
ଅନ୍ୟମାନଙ୍କୁ ସ୍ଥାନାନ୍ତରିତ ମୋଟ ଟୋକନ୍ |
contributions |
all |
ସୃଷ୍ଟି ହୋଇଥିବା କମ୍ବୋ + ବ୍ୟବହୃତ ପ୍ରଦାନକାରୀ + ବ୍ୟବହୃତ ଦକ୍ଷତା |
ର୍ୟାଙ୍କ ଗଣନା
ର୍ୟାଙ୍କଗୁଡ଼ିକ ସଂରକ୍ଷଣ କରାଯାଏ ନାହିଁ, ବରଂ ପଢ଼ିବା ସମୟରେ ଗଣନା କରାଯାଏ। ଏହା ପୁରୁଣା ର୍ୟାଙ୍କ ଡାଟାକୁ ଏଡ଼ାଇଥାଏ ଏବଂ ପର୍ଯ୍ୟାୟକ୍ରମିକ ର୍ୟାଙ୍କ ପୁନଃଗଣନା କାର୍ଯ୍ୟର ଆବଶ୍ୟକତାକୁ ଦୂର କରେ।
export async function getLeaderboard(
scope: LeaderboardScope,
period: string,
limit: number,
offset: number
): Promise<{ entries: LeaderboardEntry[]; total: number }>;
କ୍ୱେରି ପ୍ୟାଟର୍ନ:
SELECT api_key_id, score,
RANK() OVER (ORDER BY score DESC) as rank
FROM leaderboard
WHERE scope = ? AND period = ?
ORDER BY score DESC
LIMIT ? OFFSET ?
ଅବଧି ଘୂର୍ଣ୍ଣନ
ସାପ୍ତାହିକ ଏବଂ ମାସିକ ଲିଡର୍ବୋର୍ଡଗୁଡ଼ିକ ସ୍ୱୟଂଚାଳିତ ଭାବରେ ଘୂର୍ଣ୍ଣନ କରନ୍ତି:
- ଆର୍କାଇଭ୍: ଅବଧି ସୀମାରେ, ଅବଧି ଲେବଲ୍ ସହିତ ବର୍ତ୍ତମାନର ଏଣ୍ଟ୍ରିଗୁଡ଼ିକୁ
leaderboard_archiveକୁ କପି କରନ୍ତୁ। - ରିସେଟ୍: ସମାପ୍ତ ହୋଇଥିବା ଅବଧିର ଏଣ୍ଟ୍ରିଗୁଡ଼ିକୁ ବିଲୋପ କରନ୍ତୁ।
- ଟ୍ରିଗର୍: ପ୍ରତ୍ୟେକ
updateLeaderboard()କଲ୍ରେ ଯାଞ୍ଚ କରାଯାଏ; ନୂତନ ଅବଧିର ପ୍ରଥମ ଅନୁରୋଧ ଘୂର୍ଣ୍ଣନକୁ ଟ୍ରିଗର୍ କରେ।
ଏହା ସୁନିଶ୍ଚିତ କରେ ଯେ ସାପ୍ତାହିକ ବୋର୍ଡଗୁଡ଼ିକ ପ୍ରତ୍ୟେକ ସୋମବାର 00:00 UTC ରେ ଏବଂ ମାସିକ ବୋର୍ଡଗୁଡ଼ିକ ପ୍ରତ୍ୟେକ ମାସର 1 ତାରିଖରେ ରିସେଟ୍ ହୁଏ।
SSE ରିଅଲ୍-ଟାଇମ୍ ଅଦ୍ୟତନ
ଏଣ୍ଡପଏଣ୍ଟ: GET /api/gamification/stream
କ୍ଲାଏଣ୍ଟ → GET /api/gamification/stream
→ SSE ସଂଯୋଗ ସ୍ଥାପିତ ହେଲା
→ ସର୍ଭର୍ ତୁରନ୍ତ ଶୀର୍ଷ-10 ଲିଡର୍ବୋର୍ଡ ସ୍ନାପ୍ଶଟ୍ ପଠାଏ
→ ପ୍ରତି 5 ସେକେଣ୍ଡରେ: ପରିବର୍ତ୍ତନ ହୋଇଥିଲେ ଅଦ୍ୟତିତ ଶୀର୍ଷ-10 ପୁଶ୍ କରେ
→ ପ୍ରତି 15 ସେକେଣ୍ଡରେ: ହାର୍ଟବିଟ୍ ମନ୍ତବ୍ୟ (": heartbeat\n\n")
→ କ୍ଲାଏଣ୍ଟ ବିଚ୍ଛିନ୍ନ ହୁଏ → ପରିଷ୍କାର କାର୍ଯ୍ୟ (ଲିସନର୍ ଅପସାରଣ)
ଇଭେଣ୍ଟ ଫର୍ମାଟ୍:
event: leaderboard
data: {"scope":"global","entries":[...]}
event: leaderboard
data: {"scope":"weekly","entries":[...]}
: heartbeat
SSE ମ୍ୟାନେଜର୍ ପ୍ରତ୍ୟେକ ପରିସର ପାଇଁ ସଂଯୁକ୍ତ କ୍ଲାଏଣ୍ଟଗୁଡ଼ିକୁ ଟ୍ରାକ୍ କରେ ଏବଂ ଶେଷ ପୁଶ୍ ପରଠାରୁ ଲିଡର୍ବୋର୍ଡ ଡାଟା ପ୍ରକୃତରେ ପରିବର୍ତ୍ତିତ ହୋଇଥିଲେ ହିଁ ଅଦ୍ୟତନ ପଠାଏ।
ଟୋକନ୍ ସେୟାରିଂ
ଫାଇଲ୍: src/lib/gamification/sharing.ts
ଡବଲ୍-ଏଣ୍ଟ୍ରି ଲେଜର୍
ପ୍ରତ୍ୟେକ ଟ୍ରାନ୍ସଫର୍ token_ledgerରେ ଦୁଇଟି ଧାଡ଼ି ସୃଷ୍ଟି କରେ:
| ଧାଡ଼ି | from_key_id |
to_key_id |
amount |
|---|---|---|---|
| ଡେବିଟ୍ | ପ୍ରେରକ | ପ୍ରାପ୍ତକର୍ତ୍ତା | +amount |
| କ୍ରେଡିଟ୍ | ପ୍ରାପ୍ତକର୍ତ୍ତା | ପ୍ରେରକ | -amount |
ଅପେକ୍ଷା କରନ୍ତୁ — ପ୍ରଚଳିତ ନିୟମଟି ହେଉଛି:
| ଧାଡ଼ି | from_key_id |
to_key_id |
amount |
ଅର୍ଥ |
|---|---|---|---|---|
| ପଠାଇବା | ପ୍ରେରକ | ପ୍ରାପ୍ତକର୍ତ୍ତା | +amount | ପ୍ରେରକଠାରୁ ବହିର୍ଗମନ |
| ଗ୍ରହଣ କରିବା | ପ୍ରାପ୍ତକର୍ତ୍ତା | ପ୍ରେରକ | +amount | ପ୍ରାପ୍ତକର୍ତ୍ତାଙ୍କ ପାଖକୁ ଆଗମନ |
ବାଲାନ୍ସ ଏହିପରି ଗଣନା କରାଯାଏ:
SELECT
COALESCE(SUM(CASE WHEN to_key_id = ? THEN amount ELSE 0 END), 0)
- COALESCE(SUM(CASE WHEN from_key_id = ? THEN amount ELSE 0 END), 0)
AS balance
FROM token_ledger
WHERE from_key_id = ? OR to_key_id = ?
ଟ୍ରାନ୍ସଫର୍ ପ୍ରବାହ
export async function transferTokens(
fromKeyId: string,
toKeyId: string,
amount: number,
idempotencyKey: string
): Promise<{ success: boolean; balance: number }>;
- ବୈଧତା ଯାଞ୍ଚ:
amount > 0,fromKeyId !== toKeyId. - ଆଇଡେମ୍ପୋଟେନ୍ସି: ଲେଜର୍ରେ
idempotency_keyପୂର୍ବରୁ ଅଛି କି ନାହିଁ ଯାଞ୍ଚ କରନ୍ତୁ। ଯଦି ଅଛି, କ୍ୟାଶ୍ରେ ଥିବା ଫଳାଫଳ ଫେରାନ୍ତୁ। - ଟ୍ରାନ୍ଜାକ୍ସନ୍ (ଗୋଟିଏ SQLite ଟ୍ରାନ୍ଜାକ୍ସନ୍):
a. ପ୍ରେରକଙ୍କ ବାଲାନ୍ସ ଗଣନା କରନ୍ତୁ।
b. ଯଦି
balance < amount, ବାତିଲ୍ କରନ୍ତୁ (ପର୍ଯ୍ୟାପ୍ତ ପାଣ୍ଠି ନାହିଁ)। c. ପଠାଇବା ଧାଡ଼ି ଯୋଡ଼ନ୍ତୁ (from=sender,ଫେରାନ୍ତୁ।
ରେଟ୍ ସୀମିତକରଣ
- ପ୍ରତି API କୀ ପାଇଁ ପ୍ରତି ମିନିଟ୍ରେ ସର୍ବାଧିକ 10ଟି ଟ୍ରାନ୍ସଫର୍।
- ଗୋଟିଏ ଟ୍ରାନ୍ସଫର୍ରେ ସର୍ବାଧିକ 10,000 ଟୋକନ୍।
- ପ୍ରତି API କୀ ପାଇଁ ପ୍ରତିଦିନ ସର୍ବାଧିକ 100,000 ଟୋକନ୍ ଟ୍ରାନ୍ସଫର୍।
ଆମନ୍ତ୍ରଣ ଏବଂ ଟୋକନ୍ ରିଡିମ୍ କରିବା
ଫାଇଲ୍: src/lib/gamification/invites.ts
କୋଡ୍ ଫର୍ମାଟ୍
- କୋଡ୍: 8-ଅକ୍ଷର ବିଶିଷ୍ଟ ଅକ୍ଷରାଙ୍କିକ କୋଡ୍ (ଉଦାହରଣ ସ୍ୱରୂପ,
A3K9-X7M2), ମଣିଷଙ୍କ ପାଇଁ ସହଜରେ ପଠନୀୟ, ଯାହା ବ୍ୟବହାରକାରୀଙ୍କୁ ପ୍ରଦର୍ଶିତ ହୁଏ। - ଟୋକନ୍: 32-ବାଇଟ୍ ଯାଦୃଚ୍ଛିକ ଟୋକନ୍, SHA-256 ହ୍ୟାସ୍ ଭାବେ ସଂରକ୍ଷିତ। ଏହା ପ୍ରୋଗ୍ରାମାଟିକ୍ ରିଡେମ୍ପସନ୍ ପାଇଁ ବ୍ୟବହୃତ ହୁଏ (ଉଦାହରଣ ସ୍ୱରୂପ, URL ଲିଙ୍କ୍)।
ସଂରକ୍ଷଣ
| ସ୍ତମ୍ଭ | ମୂଲ୍ୟ |
|---|---|
code |
A3K9X7M2 (ଅନନ୍ୟ, ଇଣ୍ଡେକ୍ସ୍କୃତ) |
token_hash |
SHA-256(raw_token) |
କଞ୍ଚା ଟୋକନ୍ଟି ସୃଷ୍ଟି ସମୟରେ ଠିକ୍ ଥରେ ମାତ୍ର ବ୍ୟବହାରକାରୀଙ୍କୁ ଫେରାଯାଏ। OmniRoute ଏହାକୁ ପୁଣି କେବେ ସଂରକ୍ଷଣ କିମ୍ବା ପ୍ରଦର୍ଶନ କରେ ନାହିଁ — କେବଳ ହ୍ୟାସ୍ଟି ସ୍ଥାୟୀ ରହେ।
ସ୍ୱ-ରେଫରାଲ୍ ପ୍ରତିରୋଧ
ଜଣେ ବ୍ୟବହାରକାରୀ କୌଣସି କୋଡ୍ ରିଡିମ୍ କଲେ, ସିଷ୍ଟମ୍ ଯାଞ୍ଚ କରେ:
- କୋଡ୍ଟି ଏକ ଭିନ୍ନ
api_key_idର ଅଟେ। - ରିଡିମ୍ କରୁଥିବା ବ୍ୟବହାରକାରୀ ପୂର୍ବରୁ ସେହି ରେଫରର୍ଙ୍କ କୌଣସି କୋଡ୍
ରିଡିମ୍ କରିନାହାନ୍ତି (
invite_tokens+ ରିଡେମ୍ପସନ୍ ଲଗ୍ରେ ଜଏନ୍ କରାଯାଏ)।
ଯଦି ଯେକୌଣସି ଯାଞ୍ଚ ବିଫଳ ହୁଏ, ଏକ ସ୍ପଷ୍ଟ ତ୍ରୁଟି ସନ୍ଦେଶ ସହିତ ରିଡେମ୍ପସନ୍କୁ ପ୍ରତ୍ୟାଖ୍ୟାନ କରାଯାଏ।
ମିଆଦ ଓ ସୀମା
- ଡିଫଲ୍ଟ
max_uses: 10 (ସୃଷ୍ଟି ସମୟରେ ବିନ୍ୟାସଯୋଗ୍ୟ)। - ଡିଫଲ୍ଟ
expires_at: ସୃଷ୍ଟିଠାରୁ 30 ଦିନ। - ମିଆଦ ଶେଷ ହୋଇଥିବା କିମ୍ବା ବ୍ୟବହାର ସୀମା ପୂର୍ଣ୍ଣ ହୋଇଥିବା କୋଡ୍ଗୁଡ଼ିକ HTTP 410 Gone ଫେରାଏ।
କମ୍ୟୁନିଟି ସର୍ଭର ଫେଡେରେସନ୍
ଫାଇଲ୍: src/lib/gamification/servers.ts
ସଂଯୋଗ
ଏକ କମ୍ୟୁନିଟି ସର୍ଭର ରିମୋଟ୍ ସର୍ଭର ଦ୍ୱାରା ଜାରି କରାଯାଇଥିବା ଏକ ଆମନ୍ତ୍ରଣ ଟୋକନ୍ ମାଧ୍ୟମରେ ପଞ୍ଜୀକୃତ ହୁଏ। ସ୍ଥାନୀୟ ଇନଷ୍ଟାନ୍ସ:
- ଆମନ୍ତ୍ରଣ ଟୋକନ୍ ଗ୍ରହଣ କରେ (ଉଦାହରଣ ସ୍ୱରୂପ, ଡ୍ୟାଶବୋର୍ଡରେ ପେଷ୍ଟ କରାଯାଇଥିବା)।
- ଟୋକନ୍କୁ ବୈଧ କରିବା ଏବଂ ବର୍ତ୍ତମାନର ଲିଡରବୋର୍ଡ ଆଣିବା ପାଇଁ ରିମୋଟ୍ ସର୍ଭରରେ
POST /api/gamification/federation/leaderboardକଲ୍ କରେ। - ସର୍ଭର ରେକର୍ଡକୁ
status: connectedସହିତ ସଂରକ୍ଷଣ କରେ।
ସିଙ୍କ୍ ମଡେଲ୍
ଫେଡେରେସନ୍ ଓଭର୍ରାଇଟ୍ ସିଙ୍କ୍ ବ୍ୟବହାର କରେ, ଯୋଗାତ୍ମକ ସିଙ୍କ୍ ନୁହେଁ:
ସ୍ଥାନୀୟ ଇନଷ୍ଟାନ୍ସ କମ୍ୟୁନିଟି ସର୍ଭର
│ │
├── ସ୍କୋର୍ ପୁଶ୍ ─────────────►│ POST /federation/score
│ { api_key_id, score } │ (ସର୍ଭର ଟୋକନ୍ ହ୍ୟାଶ୍ ବୈଧ କରେ)
│ │
├── ଲିଡରବୋର୍ଡ ପୁଲ୍ ─────────►│ GET /federation/leaderboard
│◄── ଶୀର୍ଷ-N ଏଣ୍ଟ୍ରି ─────────┤ (ସ୍ଥାନୀୟ କ୍ୟାଶ୍କୁ ଓଭର୍ରାଇଟ୍ କରେ)
│ │
└── ସ୍ୱାସ୍ଥ୍ୟ ଯାଞ୍ଚ ─────────►│ GET /federation/health
(ପ୍ରତି 60s, ଟାଇମ୍ଆଉଟ୍ 5s) │
ପ୍ରାମାଣିକରଣ
ଫେଡେରେସନ୍ ଅନୁରୋଧଗୁଡ଼ିକରେ ଏଗୁଡ଼ିକ ଅନ୍ତର୍ଭୁକ୍ତ:
Authorization: Bearer <raw_token>
X-Federation-Version: 1
ରିମୋଟ୍ ସର୍ଭର ଟୋକନ୍କୁ ହ୍ୟାଶ୍ କରେ ଏବଂ ମେଳ ଖାଉଥିବା community_servers ଧାଡ଼ିକୁ ଖୋଜେ। ଏହା ସଂରକ୍ଷିତ ହ୍ୟାଶ୍କୁ ପ୍ରେରଣ କରିବାରୁ ବଞ୍ଚାଏ।
ସ୍ୱାସ୍ଥ୍ୟ ନିରୀକ୍ଷଣ
ପ୍ରତ୍ୟେକ ସର୍ଭର ରେକର୍ଡ ନିମ୍ନଲିଖିତ ବିଷୟଗୁଡ଼ିକୁ ଟ୍ରାକ୍ କରେ:
| ଫିଲ୍ଡ | ବର୍ଣ୍ଣନା |
|---|---|
status |
connected, degraded, unreachable |
last_sync |
ଶେଷ ସଫଳ ସିଙ୍କ୍ର ISO ଟାଇମ୍ଷ୍ଟାମ୍ପ |
failures |
କ୍ରମାଗତ ସ୍ୱାସ୍ଥ୍ୟ ଯାଞ୍ଚ ବିଫଳତା |
କ୍ରମାଗତ 5ଟି ବିଫଳତା ପରେ, ସ୍ଥିତି unreachableକୁ ପରିବର୍ତ୍ତିତ ହୁଏ ଏବଂ ଏକ ମାନୁଆଲ୍ ସ୍ୱାସ୍ଥ୍ୟ ଯାଞ୍ଚ ସଫଳ ହେବା ପର୍ଯ୍ୟନ୍ତ ସିଙ୍କ୍ ସ୍ଥଗିତ ରହେ।
ଚିଟିଂ-ପ୍ରତିରୋଧ
ଫାଇଲ୍: src/lib/gamification/antiCheat.ts
ସର୍ଭର୍-ସାଇଡ୍ ସ୍କୋରିଂ
ସମସ୍ତ XP ଗଣନା src/lib/gamification/xp.tsରେ ହୁଏ। କ୍ଲାଏଣ୍ଟମାନେ କେବେବି ସ୍କୋର୍ ଦାଖଲ କରନ୍ତି ନାହିଁ — ସେମାନେ କାର୍ଯ୍ୟଗୁଡ଼ିକ ଦାଖଲ କରନ୍ତି ଏବଂ ସର୍ଭର XP ଗଣନା କରେ। leaderboard.score ସ୍ତମ୍ଭରେ କେବଳ ସର୍ଭର୍-ସାଇଡ୍ କୋଡ୍ ଦ୍ୱାରା ଲେଖାଯାଇପାରିବ।
ହାର ସୀମିତକରଣ
| ସୀମା | ମୂଲ୍ୟ | ପରିସର |
|---|---|---|
| ପ୍ରତି ମିନିଟ୍ ସର୍ବାଧିକ XP | 1,000 | ପ୍ରତି API କୀ |
| ପ୍ରତି ମିନିଟ୍ ସର୍ବାଧିକ ଟ୍ରାନ୍ସଫର୍ | 10 | ପ୍ରତି API କୀ |
| ସର୍ବାଧିକ ଟ୍ରାନ୍ସଫର୍ ପରିମାଣ | 10,000 | ପ୍ରତି ଟ୍ରାନ୍ସଫର୍ |
| ସର୍ବାଧିକ ଦୈନିକ ଟ୍ରାନ୍ସଫର୍ | 100,000 | ପ୍ରତି API କୀ |
ହାର ସୀମାଗୁଡ଼ିକ ଏକ ଇନ୍-ମେମୋରି ସ୍ଲାଇଡିଂ ୱିଣ୍ଡୋ ବ୍ୟବହାର କରେ (open-sse/services/ରେ ଥିବା RateLimitManager ପରି ସମାନ ପାଟର୍ନ)। ପ୍ରକ୍ରିୟା ପୁନଃଆରମ୍ଭ ହେଲେ ଏହା SQLite-ସମର୍ଥିତ କାଉଣ୍ଟର୍ଗୁଡ଼ିକୁ ଫଲ୍ବ୍ୟାକ୍ କରେ।
Z-ସ୍କୋର୍ ବିସଙ୍ଗତି ଚିହ୍ନଟ
ପ୍ରତ୍ୟେକ API କୀ ପାଇଁ, ସିଷ୍ଟମ୍ ପ୍ରତି ଘଣ୍ଟାରେ ଅର୍ଜିତ XPର ଏକ ରୋଲିଂ 7-ଦିନିଆ ୱିଣ୍ଡୋ ବଜାୟ ରଖେ। ପ୍ରତ୍ୟେକ XP ପୁରସ୍କାର ସମୟରେ:
- ବ୍ୟବହାରକାରୀଙ୍କ ବର୍ତ୍ତମାନର ଘଣ୍ଟାପ୍ରତି XP ହାର ଗଣନା କରନ୍ତୁ।
- ସମଷ୍ଟିର ମାଧ୍ୟ ଏବଂ ମାନକ ବିଚ୍ୟୁତି ଗଣନା କରନ୍ତୁ।
z = (user_rate - mean) / stddevଗଣନା କରନ୍ତୁ।- ଯଦି
z > 3.0(3 ମାନକ ବିଚ୍ୟୁତି), ତେବେ ଏହାକୁ ବିସଙ୍ଗତି ଭାବରେ ଚିହ୍ନିତ କରନ୍ତୁ।
ବିସଙ୍ଗତିଗୁଡ଼ିକୁ action = 'anomaly_detected' ସହିତ xp_audit_logରେ ଲଗ୍ କରାଯାଏ ଏବଂ ଆଡମିନ୍ ଡ୍ୟାଶବୋର୍ଡରେ ପ୍ରଦର୍ଶିତ କରାଯାଏ।
ଅଡିଟ୍ ଟ୍ରେଲ୍
ପ୍ରତ୍ୟେକ XP ପୁରସ୍କାର, ଟ୍ରାନ୍ସଫର୍, ବ୍ୟାଜ୍ ଅର୍ଜନ ଏବଂ ବିସଙ୍ଗତି ଚିହ୍ନଟକୁ ନିମ୍ନଲିଖିତ ବିବରଣୀ ସହିତ xp_audit_logରେ ଲଗ୍ କରାଯାଏ:
| ଫିଲ୍ଡ | ବର୍ଣ୍ଣନା |
|---|---|
api_key_id |
କିଏ |
action |
କ’ଣ ଘଟିଲା (xp_award, transfer, anomaly, …) |
xp_awarded |
ପରିମାଣ (ଅଣ-XP ଇଭେଣ୍ଟ ପାଇଁ 0) |
metadata |
ପ୍ରସଙ୍ଗ ସହିତ JSON (କାର୍ଯ୍ୟ ପ୍ରକାର, ଲକ୍ଷ୍ୟ, …) |
created_at |
କେବେ (ISO 8601) |
ଆଡମିନ୍ମାନେ GET /api/gamification/anomalies ମାଧ୍ୟମରେ ସମ୍ପୂର୍ଣ୍ଣ ଅଡିଟ୍ ଟ୍ରେଲ୍କୁ କ୍ୱେରି କରିପାରିବେ।
API ରୁଟ୍ଗୁଡ଼ିକ
ସମସ୍ତ ରୁଟ୍ ମାନକ OmniRoute ପ୍ୟାଟର୍ନ ଅନୁସରଣ କରେ:
ରୁଟ୍ → CORS ପ୍ରିଫ୍ଲାଇଟ୍ → ବଡି ବୈଧତା ଯାଞ୍ଚ (Zod) → ପ୍ରାମାଣିକରଣ (extractApiKey)
→ ହ୍ୟାଣ୍ଡଲର୍
ଏଣ୍ଡପଏଣ୍ଟଗୁଡ଼ିକ
| ପଦ୍ଧତି | ପଥ | ବର୍ଣ୍ଣନା | ପ୍ରାମାଣିକରଣ |
|---|---|---|---|
| GET | /api/gamification/leaderboard |
ଲିଡରବୋର୍ଡ ପ୍ରାପ୍ତ କରନ୍ତୁ (ପରିସର, ଅବଧି, ପୃଷ୍ଠାଙ୍କନ) | ଇଚ୍ଛାଧୀନ |
| POST | /api/gamification/leaderboard |
ଲିଡରବୋର୍ଡ କ୍ୟାଶ୍ ବାଧ୍ୟତାମୂଳକ ଭାବେ ସତେଜ କରନ୍ତୁ | ଆବଶ୍ୟକ |
| GET | /api/gamification/stream |
SSE ରିଅଲ୍-ଟାଇମ୍ ଲିଡରବୋର୍ଡ ଅପଡେଟ୍ | ଇଚ୍ଛାଧୀନ |
| GET | /api/gamification/transfer |
ସ୍ଥାନାନ୍ତରଣ ଇତିହାସ ପ୍ରାପ୍ତ କରନ୍ତୁ (ପୃଷ୍ଠାଙ୍କନ) | ଆବଶ୍ୟକ |
| POST | /api/gamification/transfer |
ଅନ୍ୟ ଜଣେ ବ୍ୟବହାରକାରୀଙ୍କୁ ଟୋକେନ୍ ପଠାନ୍ତୁ | ଆବଶ୍ୟକ |
| GET | /api/gamification/invite |
ମୋର ଆମନ୍ତ୍ରଣ କୋଡ୍ଗୁଡ଼ିକର ତାଲିକା ଦେଖାନ୍ତୁ | ଆବଶ୍ୟକ |
| POST | /api/gamification/invite |
ଏକ ନୂଆ ଆମନ୍ତ୍ରଣ କୋଡ୍ ସୃଷ୍ଟି କରନ୍ତୁ | ଆବଶ୍ୟକ |
| DELETE | /api/gamification/invite |
ଏକ ଆମନ୍ତ୍ରଣ କୋଡ୍ ପ୍ରତ୍ୟାହାର କରନ୍ତୁ | ଆବଶ୍ୟକ |
| POST | /api/gamification/invite/redeem |
ଏକ ଆମନ୍ତ୍ରଣ କୋଡ୍ ରିଡିମ୍ କରନ୍ତୁ | ଆବଶ୍ୟକ |
| GET | /api/gamification/servers |
କମ୍ୟୁନିଟି ସର୍ଭରଗୁଡ଼ିକର ତାଲିକା ଦେଖାନ୍ତୁ | ଆବଶ୍ୟକ |
| POST | /api/gamification/servers |
ଏକ କମ୍ୟୁନିଟି ସର୍ଭର୍ ସହିତ ସଂଯୋଗ କରନ୍ତୁ | ଆବଶ୍ୟକ |
| DELETE | /api/gamification/servers |
ଏକ କମ୍ୟୁନିଟି ସର୍ଭର୍ରୁ ସଂଯୋଗ ବିଚ୍ଛିନ୍ନ କରନ୍ତୁ | ଆବଶ୍ୟକ |
| POST | /api/gamification/federation/score |
ରିମୋଟ୍ ସର୍ଭରକୁ ସ୍କୋର୍ ପଠାନ୍ତୁ | ଫେଡେରେସନ୍ |
| GET | /api/gamification/federation/leaderboard |
ରିମୋଟ୍ରୁ ଲିଡରବୋର୍ଡ ଆଣନ୍ତୁ | ଫେଡେରେସନ୍ |
| GET | /api/gamification/notifications |
SSE ବ୍ୟାଜ୍/ସ୍ତର-ବୃଦ୍ଧି ବିଜ୍ଞପ୍ତି | ଆବଶ୍ୟକ |
| GET | /api/gamification/anomalies |
ଅସଙ୍ଗତି ରିପୋର୍ଟଗୁଡ଼ିକ ଦେଖନ୍ତୁ (ଆଡମିନ୍) | ଆଡମିନ୍ |
| POST | /api/gamification/rotate |
ଆମନ୍ତ୍ରଣ ଟୋକେନ୍ ସିକ୍ରେଟ୍ଗୁଡ଼ିକ ରୋଟେଟ୍ କରନ୍ତୁ | ଆବଶ୍ୟକ |
ଅନୁରୋଧ/ପ୍ରତିକ୍ରିୟା ଉଦାହରଣଗୁଡ଼ିକ
POST /api/gamification/transfer
// ଅନୁରୋଧ
{
"to": "recipient-api-key-id",
"amount": 500,
"idempotencyKey": "uuid-v4"
}
// ପ୍ରତିକ୍ରିୟା 200
{
"success": true,
"transfer": {
"id": "txn-uuid",
"from": "sender-api-key-id",
"to": "recipient-api-key-id",
"amount": 500,
"createdAt": "2026-05-19T12:00:00.000Z"
},
"balance": 2500
}
// ପ୍ରତିକ୍ରିୟା 400 (ଅପର୍ଯ୍ୟାପ୍ତ ବାଲାନ୍ସ)
{
"error": "Insufficient balance",
"balance": 200,
"requested": 500
}
GET /api/gamification/leaderboard?scope=weekly&limit=10
{
"scope": "weekly",
"period": "2026-W20",
"entries": [
{
"rank": 1,
"apiKeyId": "key-uuid",
"displayName": "User***1234",
"score": 15230,
"level": 42,
"title": "Expert"
}
],
"total": 847,
"updatedAt": "2026-05-19T12:00:00.000Z"
}
MCP ଟୁଲ୍ଗୁଡ଼ିକ (8)
ବର୍ତ୍ତମାନ ଥିବା ଟୁଲ୍ଗୁଡ଼ିକ ସହିତ open-sse/mcp-server/ ରେ ପଞ୍ଜୀକୃତ। gamification ଅନୁମତି ପରିସର ଅଧୀନରେ ସୀମିତ।
| ଟୁଲ୍ | ବର୍ଣ୍ଣନା | ଇନ୍ପୁଟ୍ ସ୍କିମା | |
|---|---|---|---|
gamification_leaderboard |
ଏକ ପରିସର/ଅବଧି ପାଇଁ ଲିଡର୍ବୋର୍ଡ ପ୍ରାପ୍ତ କରନ୍ତୁ | { scope, period?, limit? } |
|
gamification_rank |
କଲ୍କାରୀଙ୍କ ରାଙ୍କ ଏବଂ ନିକଟସ୍ଥ ବ୍ୟବହାରକାରୀଙ୍କୁ ପ୍ରାପ୍ତ କରନ୍ତୁ | { scope } |
|
gamification_profile |
XP, ସ୍ତର, ଉପାଧି ଏବଂ ଷ୍ଟ୍ରିକ୍ ସାରାଂଶ ପ୍ରାପ୍ତ କରନ୍ତୁ | {} |
|
gamification_badges |
ଅର୍ଜିତ ବ୍ୟାଜ୍ କିମ୍ବା ସମସ୍ତ ସଂଜ୍ଞା ତାଲିକାଭୁକ୍ତ କରନ୍ତୁ | { earned?: boolean } |
|
gamification_transfer |
ଅନ୍ୟ ଜଣେ ବ୍ୟବହାରକାରୀଙ୍କୁ ଟୋକେନ୍ ପଠାନ୍ତୁ | { to, amount } |
|
gamification_invite |
ଆମନ୍ତ୍ରଣ କୋଡ୍ ସୃଷ୍ଟି କିମ୍ବା ତାଲିକାଭୁକ୍ତ କରନ୍ତୁ | `{ action: "create" | "list" }` |
gamification_servers |
କମ୍ୟୁନିଟି ସର୍ଭର୍ଗୁଡ଼ିକୁ ତାଲିକାଭୁକ୍ତ କିମ୍ବା ସଂଯୋଗ କରନ୍ତୁ | { action, token? } |
|
gamification_anomalies |
ଅସଙ୍ଗତି ରିପୋର୍ଟଗୁଡ଼ିକ ଦେଖନ୍ତୁ (ଆଡ୍ମିନ୍ ପରିସର) | { limit?, since? } |
ଡ୍ୟାସ୍ବୋର୍ଡ ପୃଷ୍ଠାଗୁଡ଼ିକ
/dashboard/leaderboard
- ପୋଡିୟମ୍ ପ୍ରଦର୍ଶନ (ଅବତାର ଏବଂ XP ସହିତ ଶୀର୍ଷ 3)।
- ପରିସର ଚୟନକାରୀ: ବିଶ୍ୱବ୍ୟାପୀ / ସାପ୍ତାହିକ / ମାସିକ / ସେୟାର୍ କରାଯାଇଥିବା ଟୋକେନ୍ / ଅବଦାନ।
- ରାଙ୍କ, ନାମ, ସ୍କୋର୍, ସ୍ତର ଏବଂ ଉପାଧି ସହିତ ପୃଷ୍ଠାବିଭାଜିତ ଟେବୁଲ୍ (ପ୍ରତି ପୃଷ୍ଠାରେ 25ଟି)।
- SSE ରିୟଲ୍-ଟାଇମ୍ ଅପଡେଟ୍ — ରାଙ୍କ ପରିବର୍ତ୍ତନଗୁଡ଼ିକ ଆନିମେଟ୍ ହୁଏ।
- "ଆପଣଙ୍କ ରାଙ୍କ" ଷ୍ଟିକି ଧାଡ଼ି ସହିତ ବର୍ତ୍ତମାନର ବ୍ୟବହାରକାରୀଙ୍କୁ ଟେବୁଲ୍ରେ ହାଇଲାଇଟ୍ କରାଯାଏ।
/dashboard/profile
- ବର୍ତ୍ତମାନର ସ୍ତର ଏବଂ ପରବର୍ତ୍ତୀ ସ୍ତରର ସୀମା ସହିତ XP ପ୍ରଗତି ବାର୍।
- ଉପାଧି ବ୍ୟାଜ୍କୁ ପ୍ରମୁଖ ଭାବରେ ପ୍ରଦର୍ଶନ କରାଯାଏ।
- ବ୍ୟାଜ୍ ଗ୍ୟାଲେରୀ — ଅର୍ଜନ ତାରିଖ ସହିତ ଅର୍ଜିତ ବ୍ୟାଜ୍, ଅନର୍ଜିତ ବ୍ୟାଜ୍ଗୁଡ଼ିକ ଧୂସର ଭାବେ ପ୍ରଦର୍ଶିତ (ଲୁକ୍କାୟିତ ବ୍ୟାଜ୍ଗୁଡ଼ିକ ଅର୍ଜିତ ହେବା ପର୍ଯ୍ୟନ୍ତ "???" ଦେଖାଏ)।
- ଅଗ୍ନିଶିଖା ଆଇକନ୍ ସହିତ ଷ୍ଟ୍ରିକ୍ କାଉଣ୍ଟର୍; ଷ୍ଟ୍ରିକ୍ କ୍ୟାଲେଣ୍ଡର୍ (ଗତ 30 ଦିନ)।
- XP ଇତିହାସ ଚାର୍ଟ (ଗତ 30 ଦିନର ଦୈନିକ XP)।
/dashboard/tokens
- ଟୋକେନ୍ ବାଲାନ୍ସ (ପୃଷ୍ଠାର ଶୀର୍ଷରେ ପ୍ରମୁଖ ଭାବରେ)।
- ସ୍ଥାନାନ୍ତରଣ ଫର୍ମ: ପ୍ରାପ୍ତକର୍ତ୍ତା, ପରିମାଣ, ନିଶ୍ଚିତକରଣ ଡାଏଲଗ୍।
- ଫିଲ୍ଟର୍ଗୁଡ଼ିକ ସହିତ ସ୍ଥାନାନ୍ତରଣ ଇତିହାସ ଟେବୁଲ୍ (ପଠାଯାଇଥିବା/ପ୍ରାପ୍ତ/ସମସ୍ତ)।
- ଆମନ୍ତ୍ରଣ ବିଭାଗ: ସକ୍ରିୟ କୋଡ୍, ନୂଆ କୋଡ୍ ସୃଷ୍ଟି, ସେୟାର୍ ଲିଙ୍କ।
- କମ୍ୟୁନିଟି ସର୍ଭର୍ଗୁଡ଼ିକ: ସ୍ୱାସ୍ଥ୍ୟ ସ୍ଥିତି ସହିତ ତାଲିକା, ସଂଯୋଗ/ବିଚ୍ଛିନ୍ନ କରନ୍ତୁ।
/dashboard/gamification/admin
- ଗୁରୁତ୍ୱ, ବ୍ୟବହାରକାରୀ, ଟାଇମ୍ଷ୍ଟାମ୍ପ ଏବଂ z-ସ୍କୋର୍ ସହିତ ଅସଙ୍ଗତି ତାଲିକା।
- ଫିଲ୍ଟର୍ଗୁଡ଼ିକ ସହିତ ଅଡିଟ୍ ଲଗ୍ ଭ୍ୟୁଅର୍ (କାର୍ଯ୍ୟ ପ୍ରକାର, ବ୍ୟବହାରକାରୀ, ତାରିଖ ପରିସର)।
- ସିଷ୍ଟମ୍ ପରିସଂଖ୍ୟାନ: ପ୍ରଦାନ କରାଯାଇଥିବା ମୋଟ XP, ସକ୍ରିୟ ବ୍ୟବହାରକାରୀ, ବ୍ୟାଜ୍ ଅର୍ଜନ ହାର।
- ଫେଡେରେସନ୍ ସର୍ଭର୍ ସ୍ୱାସ୍ଥ୍ୟ ସମୀକ୍ଷା।
ପାଇପ୍ଲାଇନ୍ ଏକୀକରଣ
ଏକୀକରଣ ବିନ୍ଦୁ
ଗେମିଫିକେସନ୍ open-sse/handlers/chatCore.ts ରେ ଥିବା ଅନୁରୋଧ ପାଇପ୍ଲାଇନ୍ର ଗୋଟିଏ ବିନ୍ଦୁରେ ସଂଯୁକ୍ତ ହୁଏ:
// କ୍ଲାଏଣ୍ଟକୁ ପ୍ରତିକ୍ରିୟା ପଠାଯିବା ପରେ:
setImmediate(() => {
emitGamificationEvent({
type: "request.completed",
apiKeyId,
metadata: {
provider: selectedProvider,
model: selectedModel,
comboId: resolvedCombo?.id,
compressionUsed: compressionStats?.applied,
skillUsed: skillExecution?.name,
},
}).catch(() => {
// ଫାୟାର୍-ଆଣ୍ଡ୍-ଫର୍ଗେଟ୍: ଲଗ୍ କରନ୍ତୁ, କିନ୍ତୁ କ୍ଲାଏଣ୍ଟକୁ କେବେ ମଧ୍ୟ ପ୍ରସାରିତ କରନ୍ତୁ ନାହିଁ
});
});
ଇଭେଣ୍ଟ ପ୍ରକାରଗୁଡ଼ିକ
| ଇଭେଣ୍ଟ ପ୍ରକାର | କେବେ ନିର୍ଗତ ହୁଏ |
|---|---|
request.completed |
ସଫଳ LLM ପ୍ରତିକ୍ରିୟା ପଠାଯାଇଛି |
provider.switch |
ପ୍ରଦାନକାରୀ ପରିବର୍ତ୍ତିତ ହୋଇଛି (କମ୍ବୋ ଫଲ୍ବ୍ୟାକ୍ ଗଣନା କରାଯାଏ) |
combo.created |
ନୂଆ କମ୍ବୋ ବିନ୍ୟାସ ସଞ୍ଚୟ କରାଯାଇଛି |
combo.used |
କମ୍ବୋ ଲକ୍ଷ୍ୟ ସଫଳତାର ସହିତ ହାସଲ ହୋଇଛି |
badge.earned |
ବ୍ୟାଜ୍ ମୂଲ୍ୟାୟନ ଏକ ମେଳ ପାଇଛି |
streak.milestone |
ଷ୍ଟ୍ରିକ୍ ସୀମା ଅତିକ୍ରମ କରାଯାଇଛି |
transfer.sent |
ଟୋକେନ୍ ସ୍ଥାନାନ୍ତରଣ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇଛି |
referral.redeemed |
ଆମନ୍ତ୍ରଣ କୋଡ୍ ସଫଳତାର ସହିତ ରିଡିମ୍ କରାଯାଇଛି |
compression.used |
ପ୍ରମ୍ପ୍ଟ ସଙ୍କୋଚନ ପ୍ରୟୋଗ କରାଯାଇଛି |
skill.executed |
କୌଶଳ ନିଷ୍ପାଦନ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇଛି |
model.first_use |
ଗତ 7 ଦିନରେ ମଡେଲ୍ ବ୍ୟବହୃତ ହୋଇନାହିଁ |
ଅବରୋଧ-ମୁକ୍ତ ନିଶ୍ଚିତତା
setImmediate + .catch(() => {}) ପ୍ୟାଟର୍ନ ନିମ୍ନଲିଖିତ ବିଷୟ ସୁନିଶ୍ଚିତ କରେ:
- ଗେମିଫିକେସନ୍ ଚାଲିବା ପୂର୍ବରୁ ପ୍ରତିକ୍ରିୟାଟି ସମ୍ପୂର୍ଣ୍ଣ ଭାବରେ ପଠାଯାଏ।
- ଗେମିଫିକେସନ୍ ତ୍ରୁଟିଗୁଡ଼ିକ କେବେ ମଧ୍ୟ କ୍ଲାଏଣ୍ଟ ପର୍ଯ୍ୟନ୍ତ ପହଞ୍ଚେ ନାହିଁ।
- ଇଭେଣ୍ଟ ପ୍ରକ୍ରିୟାକରଣ ଇନ୍ଲାଇନ୍ରେ ନୁହେଁ, ପରବର୍ତ୍ତୀ ମାଇକ୍ରୋଟାସ୍କରେ ଚାଲେ।
ସୁରକ୍ଷା
ବିପଦ ମଡେଲ୍
| ବିପଦ | ପ୍ରତିକାର |
|---|---|
| ସ୍କୋର୍ ବୃଦ୍ଧିକରଣ | କେବଳ ସର୍ଭର୍-ପକ୍ଷରେ XP ଗଣନା; କ୍ଲାଏଣ୍ଟମାନେ ସ୍କୋର୍ ନୁହେଁ, କାର୍ଯ୍ୟଗୁଡ଼ିକ ଦାଖଲ କରନ୍ତି |
| ରିପ୍ଲେ ଆକ୍ରମଣ | ସ୍ଥାନାନ୍ତରଣରେ ଆଇଡେମ୍ପୋଟେନ୍ସି କୀ; ଅଡିଟ୍ ଲଗ୍ ଡିଡୁପ୍ଲିକେସନ୍ |
| ସ୍ଥାନାନ୍ତରଣ ଠକେଇ | ଡବଲ୍-ଏଣ୍ଟ୍ରି ଲେଜର୍; ଆଟମିକ୍ ଟ୍ରାଞ୍ଜାକ୍ସନ୍; ରେଟ୍ ସୀମା |
| ସ୍ୱୟଂ-ରେଫରାଲ୍ | ରିଡେମ୍ପସନ୍ ସମୟରେ api_key_idର କ୍ରସ୍-ଚେକ୍ |
| ଲିଡର୍ବୋର୍ଡ ହେରଫେର | Z-ସ୍କୋର୍ ଅସଙ୍ଗତି ଚିହ୍ନଟ; ଆଡମିନ୍ ଅସଙ୍ଗତି ଡ୍ୟାସ୍ବୋର୍ଡ |
| ଫେଡେରେସନ୍ ଟୋକେନ୍ ଚୋରି | SHA-256 ହ୍ୟାସ୍ଯୁକ୍ତ ସଂରକ୍ଷଣ; କଞ୍ଚା ଟୋକେନ୍ କେବଳ ଥରେ ପ୍ରଦର୍ଶିତ ହୁଏ |
| ଇନ୍ଭାଇଟ୍ କୋଡ୍ରେ ବ୍ରୁଟ୍ ଫୋର୍ସ | ରିଡେମ୍ପସନ୍ ଏଣ୍ଡପଏଣ୍ଟରେ ରେଟ୍ ସୀମା; 8-ଅକ୍ଷର ଏଣ୍ଟ୍ରୋପି |
| ପ୍ରଦର୍ଶନ ନାମରେ XSS | ପ୍ରଦର୍ଶନ ନାମଗୁଡ଼ିକ ସାନିଟାଇଜ୍ କରାଯାଏ; ଲିଡର୍ବୋର୍ଡ ଏଣ୍ଟ୍ରିଗୁଡ଼ିକ ଏସ୍କେପ୍ କରାଯାଏ |
| ହ୍ୟାସ୍ ଉପରେ ଟାଇମିଂ ଆକ୍ରମଣ | ଟୋକେନ୍ ହ୍ୟାସ୍ ତୁଳନା ପାଇଁ crypto.timingSafeEqual |
ପ୍ରମାଣୀକରଣ ଆବଶ୍ୟକତା
- ସାର୍ବଜନୀନ (ପ୍ରମାଣୀକରଣ ନାହିଁ):
GET /leaderboard,GET /stream(କେବଳ-ପଠନୀୟ ଲିଡର୍ବୋର୍ଡଗୁଡ଼ିକ)। - API କୀ ଆବଶ୍ୟକ: ସମସ୍ତ ଲେଖନ କାର୍ଯ୍ୟ, ପ୍ରୋଫାଇଲ୍, ସ୍ଥାନାନ୍ତରଣ, ଇନ୍ଭାଇଟ୍।
- କେବଳ ଆଡମିନ୍: ଅସଙ୍ଗତି ଡ୍ୟାସ୍ବୋର୍ଡ, ଅଡିଟ୍ ଲଗ୍ ଭ୍ୟୁଅର୍।
- ଫେଡେରେସନ୍:
Authorizationହେଡର୍ରେ କଞ୍ଚା ଟୋକେନ୍ ବ୍ୟବହାର କରୁଥିବା ପୃଥକ ପ୍ରମାଣୀକରଣ ପଥ, ଯାହାକୁ ସଂରକ୍ଷିତ SHA-256 ହ୍ୟାସ୍ ସହ ଯାଞ୍ଚ କରାଯାଏ।
ପରୀକ୍ଷଣ
ପରୀକ୍ଷଣ ଫାଇଲ୍ଗୁଡ଼ିକ
ସମସ୍ତ ପରୀକ୍ଷଣ Node.jsର ନେଟିଭ୍ ପରୀକ୍ଷଣ ରନର୍ (node --import tsx/esm --test) ବ୍ୟବହାର କରେ।
| ପରୀକ୍ଷଣ ଫାଇଲ୍ | ଅନ୍ତର୍ଭୁକ୍ତ ବିଷୟ | ପରୀକ୍ଷଣ |
|---|---|---|
tests/unit/gamification/xp.test.ts |
XP ଗଣନା, ଲେଭଲ୍ କର୍ଭ, ଉପାଧିଗୁଡ଼ିକ | 8 |
tests/unit/gamification/badges.test.ts |
ବ୍ୟାଜ୍ ମାନଦଣ୍ଡ ମେଳ, ପ୍ରଦାନ | 10 |
tests/unit/gamification/streaks.test.ts |
ଷ୍ଟ୍ରିକ୍ ଲଜିକ୍, ମାଇଲ୍ଷ୍ଟୋନ୍, ପ୍ରାନ୍ତୀୟ ପରିସ୍ଥିତି | 7 |
tests/unit/gamification/leaderboard.test.ts |
ରାଙ୍କ୍ ଗଣନା, ପୃଷ୍ଠାଙ୍କନ, ଘୂର୍ଣ୍ଣନ | 8 |
tests/unit/gamification/sharing.test.ts |
ସ୍ଥାନାନ୍ତରଣ, ବାଲାନ୍ସ, ଆଇଡେମ୍ପୋଟେନ୍ସି | 9 |
tests/unit/gamification/invites.test.ts |
ସୃଷ୍ଟି, ରିଡିମ୍, ମିଆଦ ସମାପ୍ତି, ସ୍ୱୟଂ-ରେଫରାଲ୍ | 7 |
tests/unit/gamification/antiCheat.test.ts |
ରେଟ୍ ସୀମା, z-ସ୍କୋର୍, ଅଡିଟ୍ ଲଗିଂ | 6 |
tests/unit/gamification/events.test.ts |
ଇଭେଣ୍ଟ ନିର୍ଗମନ, ଫ୍ୟାନ୍-ଆଉଟ୍, ତ୍ରୁଟି ପରିଚାଳନା | 5 |
ପରୀକ୍ଷଣ ଚଳାଇବା
# ସମସ୍ତ ଗେମିଫିକେସନ୍ ପରୀକ୍ଷଣ
node --import tsx/esm --test tests/unit/gamification/*.test.ts
# ଗୋଟିଏ ପରୀକ୍ଷଣ ଫାଇଲ୍
node --import tsx/esm --test tests/unit/gamification/xp.test.ts
କଭରେଜ୍ ଆବଶ୍ୟକତା
CONTRIBUTING.md ଅନୁଯାୟୀ — ସମସ୍ତ ନୂଆ ମଡ୍ୟୁଲ୍ରେ ନିମ୍ନଲିଖିତ ରହିବା ଆବଶ୍ୟକ:
- ବ୍ରାଞ୍ଚ କଭରେଜ୍ >= 80%।
- ପ୍ରତ୍ୟେକ ସାର୍ବଜନୀନ ଫଙ୍କସନ୍କୁ ଅତି କମ୍ରେ ଥରେ ପରୀକ୍ଷା କରାଯିବ।
- ତ୍ରୁଟି ପଥଗୁଡ଼ିକ ପରୀକ୍ଷା କରାଯିବ (ଅପର୍ଯ୍ୟାପ୍ତ ବାଲାନ୍ସ, ମିଆଦ ସମାପ୍ତ କୋଡ୍, ରେଟ୍ ସୀମା)।
ଫାଇଲ୍ ଗଠନ
src/
lib/
db/
migrations/
060_create_gamification.sql # ସମସ୍ତ 8ଟି ଟେବୁଲ୍ + ଇଣ୍ଡେକ୍ସ
gamification.ts # ଡୋମେନ୍ CRUD ମଡ୍ୟୁଲ୍
gamification/
xp.ts # XP ଗଣନା, ସ୍ତର କର୍ଭ, ଉପାଧି
badges.ts # ବ୍ୟାଜ୍ ସଂଜ୍ଞା, ମାନଦଣ୍ଡ, ମୂଲ୍ୟାୟନ
streaks.ts # ଦୈନିକ ଷ୍ଟ୍ରିକ୍ ଟ୍ରାକିଂ
leaderboard.ts # ରାଙ୍କ ଗଣନା, SSE, ରୋଟେସନ୍
antiCheat.ts # ହାର ସୀମିତକରଣ, z-ସ୍କୋର୍, ଅଡିଟ୍
sharing.ts # ଟୋକେନ୍ ସ୍ଥାନାନ୍ତରଣ ଲେଜର୍
invites.ts # ଆମନ୍ତ୍ରଣ/ରିଡିମ୍ କୋଡ୍
servers.ts # କମ୍ୟୁନିଟି ସର୍ଭର୍ ଫେଡେରେସନ୍
events.ts # ଇଭେଣ୍ଟ ଏମିଟର୍ (ଏକୀକରଣ ବିନ୍ଦୁ)
notifications.ts # SSE ବିଜ୍ଞପ୍ତି ଷ୍ଟ୍ରିମ୍
app/
api/
gamification/
leaderboard/route.ts # GET/POST ଲିଡର୍ବୋର୍ଡ
leaderboard/stream/route.ts # SSE ରିୟଲ୍-ଟାଇମ୍ ଅପଡେଟ୍
transfer/route.ts # GET/POST ସ୍ଥାନାନ୍ତରଣ
invite/route.ts # GET/POST/DELETE ଆମନ୍ତ୍ରଣ କୋଡ୍
invite/redeem/route.ts # POST ରିଡିମ୍ କୋଡ୍
servers/route.ts # GET/POST/DELETE ସର୍ଭର୍
federation/score/route.ts # POST ସ୍କୋର୍ ପୁସ୍
federation/leaderboard/route.ts # GET ଲିଡର୍ବୋର୍ଡ ପୁଲ୍
notifications/route.ts # SSE ବିଜ୍ଞପ୍ତି
anomalies/route.ts # GET ବିସଙ୍ଗତି ରିପୋର୍ଟ
rotate/route.ts # POST ଗୁପ୍ତ ତଥ୍ୟ ରୋଟେଟ୍
(dashboard)/
dashboard/
leaderboard/page.tsx # ରାଙ୍କିଂ ପୃଷ୍ଠା
profile/page.tsx # XP/ବ୍ୟାଜ୍/ଷ୍ଟ୍ରିକ୍ ପୃଷ୍ଠା
tokens/page.tsx # ବାଲାନ୍ସ/ସ୍ଥାନାନ୍ତରଣ/ଆମନ୍ତ୍ରଣ ପୃଷ୍ଠା
gamification/admin/page.tsx # ଆଡମିନ୍ ବିସଙ୍ଗତି ନିରୀକ୍ଷଣ
shared/
constants/
gamification.ts # XP_REWARDS, TITLES, BADGE_DEFS, LIMITS
tests/
unit/
gamification/
xp.test.ts
badges.test.ts
streaks.test.ts
leaderboard.test.ts
sharing.test.ts
invites.test.ts
antiCheat.test.ts
events.test.ts
docs/
frameworks/
GAMIFICATION.md # ଏହି ଡକ୍ୟୁମେଣ୍ଟ
ମାଇଗ୍ରେସନ୍ ରଣନୀତି
ପର୍ଯ୍ୟାୟ 1: ବ୍ୟାକ୍ଏଣ୍ଡ୍ କୋର୍ (PR 1)
- ମାଇଗ୍ରେସନ୍
060_create_gamification.sql(8ଟି ଟେବୁଲ୍)। src/lib/db/gamification.ts(ଡୋମେନ୍ ମଡ୍ୟୁଲ୍)।src/lib/gamification/xp.ts,streaks.ts,events.ts।chatCore.tsରେ ଏକୀକରଣ ବିନ୍ଦୁ।- XP, ଷ୍ଟ୍ରିକ୍ ଏବଂ ଇଭେଣ୍ଟ ପାଇଁ ୟୁନିଟ୍ ଟେଷ୍ଟ।
ପର୍ଯ୍ୟାୟ 2: ବ୍ୟାଜ୍ ଏବଂ ଲିଡର୍ବୋର୍ଡ (PR 2)
src/lib/gamification/badges.ts,leaderboard.ts।- କନ୍ଷ୍ଟାଣ୍ଟ୍ରେ ବ୍ୟାଜ୍ ସଂଜ୍ଞା।
- ଲିଡର୍ବୋର୍ଡ API ରୁଟ୍ + SSE ଷ୍ଟ୍ରିମ୍।
- ବ୍ୟାଜ୍ ଏବଂ ଲିଡର୍ବୋର୍ଡ ପାଇଁ ୟୁନିଟ୍ ଟେଷ୍ଟ।
ପର୍ଯ୍ୟାୟ 3: ସେୟାରିଂ ଏବଂ ଆମନ୍ତ୍ରଣ (PR 3)
src/lib/gamification/sharing.ts,invites.ts,antiCheat.ts।- ସ୍ଥାନାନ୍ତରଣ + ଆମନ୍ତ୍ରଣ API ରୁଟ୍।
- ସେୟାରିଂ, ଆମନ୍ତ୍ରଣ ଏବଂ ଆଣ୍ଟି-ଚିଟ୍ ପାଇଁ ୟୁନିଟ୍ ଟେଷ୍ଟ।
ପର୍ଯ୍ୟାୟ 4: ଫେଡେରେସନ୍ ଏବଂ ଡ୍ୟାସ୍ବୋର୍ଡ (PR 4)
src/lib/gamification/servers.ts,notifications.ts।- ଫେଡେରେସନ୍ API ରୁଟ୍।
- ଡ୍ୟାସ୍ବୋର୍ଡ ପୃଷ୍ଠାଗୁଡ଼ିକ (ଲିଡର୍ବୋର୍ଡ, ପ୍ରୋଫାଇଲ୍, ଟୋକେନ୍, ଆଡମିନ୍)।
- MCP ଟୁଲ୍ ପଞ୍ଜୀକରଣ।
ଭବିଷ୍ୟତର ବିଚାରଗୁଡ଼ିକ
- ଋତୁକାଳୀନ ଇଭେଣ୍ଟଗୁଡ଼ିକ: ସୀମିତ ସମୟ ପାଇଁ ବ୍ୟାଜ୍ ସେଟ୍ ଏବଂ ଲିଡରବୋର୍ଡ ସିଜନ୍।
- ଟିମ୍ ଲିଡରବୋର୍ଡଗୁଡ଼ିକ: ସଂଗଠନ କିମ୍ବା କମ୍ବୋ ଅନୁସାରେ ବ୍ୟବହାରକାରୀମାନଙ୍କୁ ଗୋଷ୍ଠୀଭୁକ୍ତ କରନ୍ତୁ।
- XP ଗୁଣକଗୁଡ଼ିକ: ପ୍ରଚାରମୂଳକ ଅବଧିରେ XP ବୃଦ୍ଧି କରନ୍ତୁ।
- ଉପଲବ୍ଧି ଅଂଶୀଦାରୀ: ଅଂଶୀଦାର କରାଯାଇପାରୁଥିବା ବ୍ୟାଜ୍ କାର୍ଡଗୁଡ଼ିକ (OpenGraph ପ୍ରତିଛବି) ସୃଷ୍ଟି କରନ୍ତୁ।
- ମୋବାଇଲ୍ ପୁଶ୍: ବ୍ୟାଜ୍/ସ୍ତର ଇଭେଣ୍ଟଗୁଡ଼ିକ ପାଇଁ webhook-ଆଧାରିତ ବିଜ୍ଞପ୍ତି।
- ଲିଡରବୋର୍ଡ API: ତୃତୀୟ-ପକ୍ଷ ସମନ୍ୱୟ ପାଇଁ ସାର୍ବଜନୀନ API।