Streak & Attendance System
Reward consistent engagement with streak bonuses and milestone rewards.
How Streaks Work
- Users check in daily with
/daily - Consecutive days build their streak counter
- Streak multipliers increase rewards
- Milestone bonuses unlock at specific days
Streak Multipliers
Higher streaks mean higher rewards on all activities:
| Streak Days | Multiplier | Bonus |
|---|---|---|
| 1-2 days | 1.0x | Base reward |
| 3+ days | 1.1x | 10% bonus |
| 7+ days | 1.25x | 25% bonus |
| 14+ days | 1.5x | 50% bonus |
| 30+ days | 2.0x | 100% bonus |
Calculation Example
Base daily reward: 25 RSNC
| Streak | Calculation | Total |
|---|---|---|
| Day 1 | 25 × 1.0 | 25 RSNC |
| Day 3 | 25 × 1.1 | 27.5 RSNC |
| Day 7 | 25 × 1.25 | 31.25 RSNC |
| Day 14 | 25 × 1.5 | 37.5 RSNC |
| Day 30 | 25 × 2.0 | 50 RSNC |
Milestone Bonuses
One-time bonuses for hitting streak milestones:
| Milestone | Bonus |
|---|---|
| 7 days | 50 RSNC |
| 30 days | 200 RSNC |
| 100 days | 1,000 RSNC |
| 365 days | 5,000 RSNC |
Users claim milestones via /streak.
Grace Period
The grace period allows users to miss time without losing their streak.
Default: 24 Hours
Users have 24 hours from their last check-in before their streak resets.
Configure Grace Period
/config streaks grace-period:8 # 8 hours (stricter)
/config streaks grace-period:48 # 48 hours (more forgiving)
Range: 1-72 hours
Strategy Guide
| Grace Period | Best For |
|---|---|
| 8 hours | Active communities, frequent engagement |
| 24 hours (default) | Standard daily engagement |
| 48 hours | Casual communities, weekend forgiveness |
| 72 hours | Very casual, maximum forgiveness |
User Commands
View Streak Status
/streak
Shows:
- Current streak days
- Longest streak ever
- Current multiplier
- Next milestone
- Available milestone claims
Claim Milestone
/streak claim milestone:7
Claims the 7-day milestone bonus (if eligible).
How Streak is Tracked
Daily Check-in
When a user runs /daily:
- Check if within grace period from last check-in
- If yes: Increment streak counter
- If no: Reset streak to 1
- Record check-in timestamp
- Apply multiplier to reward
Streak Persistence
Streaks are stored in the discord_user_streaks table:
current_streak- Current consecutive dayslongest_streak- All-time recordlast_checkin- Timestamp of last activity
Configuration in Partner Portal
Integrations → Discord → Streak Settings
Available Settings
- Enable/disable streaks
- Grace period (hours)
- Streak multipliers (customize thresholds)
- Milestone bonuses (customize amounts)
Best Practices
Encourage Daily Engagement
- Reasonable base rewards: Don't make day 1 too low
- Meaningful multipliers: 2x at day 30 is significant
- Achievable milestones: 7-day milestone should be reachable
Prevent Burnout
- Forgiving grace period: 24-48 hours recommended
- Weekend consideration: 48+ hours helps weekend breaks
- Communicate clearly: Users should know the rules
Combine with Other Features
- Role rewards: VIP members get streak bonuses
- Announcements: Celebrate milestone achievements
- Leaderboards: Show streak rankings
Troubleshooting
"My streak reset unexpectedly"
- Grace period expired: Check when last check-in was
- Different timezone: Resets at midnight UTC
- Test mode was on: Test activities don't count
"Multiplier isn't applying"
- Check current streak:
/streak - Verify multiplier threshold: Must hit exact day count
- Confirm streaks are enabled: Check Partner Portal
"Milestone already claimed"
Each milestone can only be claimed once. Check /streak for available milestones.
Role-Based Milestones
Beyond streak milestones, admins can create role-based milestones that auto-assign Discord roles when users meet compound criteria. Users also receive a one-time RSNC bonus when the milestone is unlocked.
How It Works
- Admin creates a milestone linked to a Discord role via
/milestone create - Admin adds one or more criteria via
/milestone add-criteria - A CRON job periodically evaluates all users against milestone criteria
- When a user meets all criteria, they receive the Discord role and RSNC bonus automatically
Available Criteria Types
| Criteria | Source | Description |
|---|---|---|
messages_total | KV stats | Total messages sent |
rsnc_earned | KV stats | Lifetime RSNC earned from bot |
voice_hours | KV stats | Total voice channel hours |
reactions_total | KV stats | Total reactions given |
streak_days | KV stats | Current streak length |
streak_longest | KV stats | Longest streak ever |
claims_total | KV stats | Total reward claims |
activity_score | Calculated | Composite engagement score |
rsnc_balance | On-chain | Current RSNC token balance |
Activity Score Formula
The activity_score is a weighted composite of multiple engagement signals:
activity_score = totalMessages
+ (totalVoiceMinutes × 2)
+ (totalReactions × 5)
+ (currentStreak × 10)
Suggested thresholds:
| Level | Score | Typical Profile |
|---|---|---|
| Beginner | 50 | A few messages + some reactions |
| Active | 500 | Regular daily participant |
| Power User | 2,000 | Heavy multi-channel engagement |
| Legend | 10,000 | Long-term dedicated community member |
Compound Criteria
Milestones support multiple criteria — the user must meet all of them. This allows nuanced role requirements:
/milestone create role:@Whale name:Whale
/milestone add-criteria role:@Whale type:rsnc_earned threshold:5000
/milestone add-criteria role:@Whale type:messages_total threshold:500
/milestone add-criteria role:@Whale type:activity_score threshold:2000
Admin Commands
/milestone create role:@VIP name:"VIP Member" description:"Top contributor"
/milestone edit role:@VIP reward:1000
/milestone add-criteria role:@VIP type:rsnc_earned threshold:5000
/milestone remove-criteria role:@VIP type:rsnc_earned
/milestone list
/milestone delete role:@VIP
Storage
Milestones are stored in the discord_role_configs table with assignment_type = 'milestone'. Criteria are stored in assignment_config.criteria as an array of { type, threshold } objects. The RSNC bonus is stored in effect_config.amount.