Dashboard
Live data from your bot's API
Guilds Configured
—
Tracked Users
—
Commands
4
Save Interval
30s
Connect your bot API to load live data → ⚙ API Settings
Guilds
Per-guild configuration — run commands directly from here
GUILD REGISTRY—
| Guild ID | Threshold | Msg Floor | Active Role | Inactive Role | Tracked | Role Add | Actions |
|---|---|---|---|---|---|---|---|
| No data — configure API settings first. | |||||||
Users
Activity timestamps, message counts, and status per user
No data — configure API settings first.
Commands
All 4 bot commands — copy to Discord or run via API
!activitymonitor setup
ADMIN
Interactive setup wizard — walks an admin through full guild configuration via Discord messages. Auto-creates roles if they don't exist.
1
Bot asks for
inactiveThresholdDays — days of silence before a user is marked inactive.2
Bot asks for the Active Role name. Creates it automatically if needed.
3
Bot asks for the Inactive Role name. Type
none to skip.4
Bot asks for
messageThreshold — messages needed to earn the active role.!activitymonitor purge
ADMIN
Force-triggers the inactivity check for all tracked users in the current guild immediately, without waiting for the next scheduled check.
1
Iterates through every user in the guild's
users object.2
Compares each user's last active timestamp against
inactiveThresholdDays.3
Removes the Active Role and adds the Inactive Role for users over the threshold.
!activitymonitor register-existing
ADMIN
Scans all members who already have the Active Role and registers them into the tracking system with today's timestamp. Ideal for first-time setup on an existing server.
1
Fetches all guild members who currently hold the configured
activeRoleID.2
Registers each one in
users with Date.now() as their last activity timestamp.3
Skips already-tracked members. Reports how many were newly registered.
!activitymonitor create-role
ADMIN
Manually creates an activity tracking role. Normally handled by setup, but useful if the role was accidentally deleted.
1
Bot (or dashboard) prompts for the desired role name.
2
Creates the role via Discord API and stores the new
roleID in guilds.json.Config Fields
guilds.json schema + spam rules reference
GUILD DATA SCHEMA — guilds.json
| Field | Type | Description | Default |
|---|---|---|---|
| id | string | Discord guild snowflake ID | — |
| inactiveThresholdDays | number | Days of silence before user is considered inactive | set via setup |
| activeRoleID | string|null | Role ID assigned to active users | null |
| inactiveRoleID | string|null | Role ID assigned to inactive users | null |
| users | object | userID → ISO last-active timestamp for tracked (role-holding) users | {} |
| allowRoleAddition | boolean | Whether bot may assign roles to new users | true |
| ignoredUserIDs | array | User IDs excluded from all activity tracking | [] |
| messageThreshold | number | Minimum messages to earn active status | 30 |
| messageCounts | object | userID → message count toward threshold | {} |
| lastMessageTime | object | userID → Unix timestamp (ms) of last message | {} |
| lastMessageContent | object | userID → last message text (used for duplicate detection) | {} |
SPAM DETECTION RULES
| Layer | Rule | Value |
|---|---|---|
| Global | Sliding-window rate limit | 5 s window · max 3 msgs |
| Global | Duplicate consecutive message | Rejected |
| Per-guild | Minimum message length | 3 characters |
| Per-guild | Emoji-only messages | Rejected |
| Per-guild | Repeated-character messages | Rejected (4+ repeats) |
| Per-guild | Per-user cooldown | 5 seconds |
| Per-guild | Duplicate content detection | Rejected |