Skip to content

Rewards Module

Location: src/modules/rewards/

Guild reward distribution system.

Features

  • Custom Rewards - Create guild-specific rewards
  • Templates - Predefined reward templates
  • User Tracking - Track distributed rewards
  • Integration - Extensible reward system
  • Statistics - Reward distribution analytics

Structure

src/modules/rewards/
├── services/
│   └── RewardService.ts       # Core reward logic
├── integrations/
│   └── RewardIntegration.ts   # External integrations
└── index.ts

RewardService

Manage rewards:

typescript
import { rewardService } from '#modules/rewards/index.js';

// Create reward
const reward = await rewardService.createReward({
  guildId,
  name: 'VIP Access',
  description: '1 month VIP role',
  type: 'ROLE',
  value: roleId,
  cost: 1000, // XP cost or other currency
});

// Get rewards
const rewards = await rewardService.getRewards(guildId);

// Get reward by ID
const reward = await rewardService.getReward(rewardId);

// Award reward to user
await rewardService.awardReward(guildId, userId, rewardId);

// Get user rewards
const userRewards = await rewardService.getUserRewards(guildId, userId);

// Delete reward
await rewardService.deleteReward(rewardId);

Reward Templates

Predefined reward templates:

typescript
import { templateService } from '#modules/rewards/index.js';

// Get templates
const templates = await templateService.getTemplates(guildId);

// Get template by name
const template = await templateService.getTemplate(guildId, 'vip_role');

// Create from template
const reward = await rewardService.createFromTemplate(guildId, templateName, options);

Types

Reward

typescript
interface Reward {
  id: number;
  guildId: string;
  name: string;
  description?: string;
  type: RewardType;
  value: string;       // Role ID, item code, etc.
  cost: number;        // XP cost
  stock?: number;      // Limited quantity
  expiresAt?: Date;    // Expiration date
  enabled: boolean;
  createdAt: Date;
}

RewardType

typescript
enum RewardType {
  ROLE = 'ROLE',       // Discord role
  CUSTOM = 'CUSTOM',   // Custom reward
  ITEM = 'ITEM',       // Virtual item
}

UserReward

typescript
interface UserReward {
  id: number;
  guildId: string;
  userId: string;
  rewardId: number;
  awardedAt: Date;
  awardedBy?: string;  // Who awarded (for manual)
  expiresAt?: Date;
}

RewardTemplate

typescript
interface RewardTemplate {
  name: string;
  description: string;
  type: RewardType;
  defaultCost: number;
}

Database Models

Reward

prisma
model Reward {
  id          Int        @id @default(autoincrement())
  guildId     String
  name        String
  description String?
  type        RewardType
  value       String
  cost        Int
  stock       Int?
  expiresAt   DateTime?
  enabled     Boolean    @default(true)
  createdAt   DateTime   @default(now())
  updatedAt   DateTime   @updatedAt

  userRewards UserReward[]

  @@index([guildId])
}

UserReward

prisma
model UserReward {
  id        Int      @id @default(autoincrement())
  guildId   String
  userId    String
  rewardId  Int
  awardedAt DateTime @default(now())
  awardedBy String?
  expiresAt DateTime?

  reward    Reward   @relation(fields: [rewardId], references: [id])

  @@index([guildId, userId])
}

REST API

EndpointMethodDescription
/guilds/:id/rewardsGETList rewards
/guilds/:id/rewardsPOSTCreate reward
/guilds/:id/rewards/:rewardIdGETGet reward
/guilds/:id/rewards/:rewardIdDELETEDelete reward
/guilds/:id/rewards/statsGETReward statistics
/guilds/:id/rewards/users/:userIdGETUser's rewards
/guilds/:id/rewards/templatesGETList templates

Commands

CommandDescription
/rewards listView available rewards
/rewards claimClaim a reward
/rewards createCreate a reward (admin)
/rewards deleteDelete a reward (admin)
/rewards giveGive reward to user (admin)

CATTO v2.x