BobBot Nexus is a modular Discord bot for ARK: Survival Ascended server owners.
It is designed to help server owners manage automated raid bases, boss events, Discord announcements, in-game announcements, role buttons, active event tracking, and RCON-based server automation from one shared bot framework.
BobBot Nexus currently includes:
-
AutoBases Controller Controls Auto Bases Ascended raid-base spawning, active-base tracking, public Discord announcements, in-game announcements, scheduler logic, role buttons, auto-wipe, and cap enforcement.
-
Boss Events Controller Controls ServerEventsAscended boss/event spawns, public Discord announcements, in-game announcements, alert role buttons, active-event locks, and feed-based completion tracking.
-
Nexus Core Provides the shared config loader, state manager, RCON helper, admin permission helper, update checker, and core
/nexuscommands.
Never publish or send a live config.json that contains real credentials.
A live config may contain:
- Discord bot token
- RCON host/IP
- RCON password
- Discord channel IDs
- Discord role IDs
- private server layout
- active module settings
For setup or public sharing, use the included blank/example files:
config.jsonconfig.commented.jsonstate.json
The commented config file is a setup guide only. JSON comments are not valid in strict .json files.
A public release package should not include development junk, cache folders, personal backups, or live server data.
A clean compiled EXE release should include:
BobBotNexus.execonfig.blank.jsonconfig.commented.jsoncstate.blank.jsonREADME.md
A clean source-code release should include:
BobBotNexus.pycore/modules/requirements.txtconfig.blank.jsonconfig.commented.jsoncstate.blank.jsonREADME.md
Do not include:
__pycache__/core/__pycache__/modules/__pycache__/- old backup files
- personal backup folders
- a live
config.json - a live
state.json - temporary
.tmpfiles - private test configs
- real Discord tokens
- real RCON passwords
For live use, copy the blank files:
copy config.blank.json config.json
copy state.blank.json state.jsonThen edit config.json with your own Discord, RCON, server, and module settings.
| File / Folder | Purpose |
|---|---|
BobBotNexus.py |
Main Python launcher and core /nexus commands |
BobBotNexus.exe |
Optional compiled executable version |
config.json |
Live bot configuration |
state.json |
Runtime state, dashboard IDs, active bases/events, and message IDs |
requirements.txt |
Python dependencies for source-code installs |
core/ |
Shared config, state, RCON, context, and permission helpers |
modules/autobases.py |
AutoBases Controller module |
modules/boss_events.py |
Boss Events Controller module |
| File | Purpose |
|---|---|
config.blank.json |
Safe blank config with placeholders |
config.commented.jsonc |
Detailed commented setup guide |
state.blank.json |
Safe blank runtime state |
README.md |
Main setup and usage guide |
There are two common ways to run BobBot Nexus:
- Run from source using Python.
- Run as a compiled
.exe.
- Windows server or PC
- Python 3.11 or newer
- Discord bot token
- RCON enabled on your ARK servers
- Required ARK plugins installed, depending on which modules you enable
Install dependencies:
py -m pip install -r requirements.txtCreate live config and state files:
copy config.blank.json config.json
copy state.blank.json state.jsonEdit:
config.jsonStart the bot:
py BobBotNexus.pyIf using the compiled version, place these files in the same folder:
BobBotNexus.exe
config.json
state.json
README.md
Create your live config/state first:
copy config.blank.json config.json
copy state.blank.json state.jsonThen run:
BobBotNexus.exeWhen running as an EXE, config.json and state.json must stay next to BobBotNexus.exe.
Create a Discord bot in the Discord Developer Portal.
Common required permissions:
- Send Messages
- Embed Links
- Read Message History
- Use Slash Commands
- Manage Roles, only if using alert role buttons
- Manage Messages, only if using auto-delete cleanup posts
Enable Message Content Intent if using modules that read Discord webhook/feed messages.
In config.json, configure:
"discord": {
"bot_token": "PUT_BOT_TOKEN_HERE",
"guild_id": 0,
"admin_role_ids": [],
"admin_command_channel_id": 0,
"bot_update_feed_channel_id": 0
}| Field | Meaning |
|---|---|
bot_token |
Discord bot token |
guild_id |
Discord server ID |
admin_role_ids |
Role IDs allowed to use admin commands |
admin_command_channel_id |
Default admin command channel |
bot_update_feed_channel_id |
Optional channel for update notices |
If admin_role_ids is empty, Discord server administrators can use admin commands.
Each server under servers is an RCON target.
Example:
"island": {
"display_name": "The Island",
"host": "PUT_RCON_HOST_HERE",
"port": 0,
"password": "PUT_RCON_PASSWORD_HERE",
"enabled": false
}| Field | Meaning |
|---|---|
display_name |
Friendly map/server name shown in Discord |
host |
RCON IP or hostname |
port |
RCON port |
password |
RCON password |
enabled |
Whether this server is available to modules |
The server_key used inside AutoBases maps and Boss Events spawn pools must match one of these top-level server keys.
Example:
"server_key": "island"matches:
"servers": {
"island": {}
}| Command | Description |
|---|---|
/nexus status |
Show loaded modules and enabled servers |
/nexus reload |
Reload config.json and state.json |
/nexus refresh_commands |
Force-refresh slash commands in the current Discord server |
/nexus update_check |
Check GitHub releases for a newer bot version |
Module enable/disable changes require a full restart.
Most normal config value changes can be applied with:
/nexus reload
The AutoBases Controller is configured under:
"modules": {
"autobases": {}
}Enable it with:
"enabled": trueThis module expects:
- Auto Bases Ascended installed on the ARK server
- RCON enabled
- matching server entries under
servers - AutoBases templates configured in the plugin
- AutoBases spawn groups configured in the plugin
- optional AutoBases webhook/feed channel for active/completed messages
The module uses RCON commands such as:
ab.activebases
ab.spawnrandomgroup <group>
ab.spawn <template name>
ab.destroybase <base id>
ab.destroyfromtemplate <template name>
| Command | Description |
|---|---|
/ab status |
Show module status, active bases, scheduler status, and auto-wipe info |
/ab config |
Show readable config overview, caps, maps, templates, tags, and group caps |
/ab scheduler |
Show scheduler eligibility by map |
/ab dashboard |
Create or update the AutoBases dashboard message |
/ab alert_buttons |
Create or update raid alert role buttons |
/ab resync |
Resync active bases from ab.activebases |
/ab active |
Show active bases on a selected map |
/ab destroy_base |
Destroy one active base by base ID |
/ab spawn_base |
Spawn one exact template/base name |
/ab destroy |
Destroy all active bases from one template/base name |
/ab spawn |
Spawn a random base from a configured plugin spawn group |
/ab pause |
Pause scheduler for a map |
/ab resume |
Resume scheduler for a map |
Each AutoBases map lives under:
"modules": {
"autobases": {
"maps": {}
}
}Example:
"island": {
"server_key": "island",
"plugin_map_name": "TheIsland_WP",
"enabled": true,
"max_active": 1,
"cooldown_minutes": 120,
"spawn_interval_minutes": 300,
"spawn_weight": 1,
"spawn_groups": [
{
"name": "Tier1",
"weight": 100
}
],
"templates": [
{
"name": "Example Raid Base",
"enabled": true,
"tags": [
"tier1",
"starter"
]
}
]
}| Field | Meaning |
|---|---|
server_key |
Must match a top-level servers key |
plugin_map_name |
Map name used by AutoBases plugin/webhook |
enabled |
Enables this map for scheduling/resync |
max_active |
Legacy per-map max; new configs should use caps.map_caps |
cooldown_minutes |
Cooldown after completion or auto-wipe |
spawn_interval_minutes |
Per-map scheduler timer |
spawn_weight |
Used by cluster scheduler mode |
spawn_groups |
Plugin group names for ab.spawnrandomgroup |
templates |
Exact template/base names and optional tags |
The template name must match the Auto Bases Ascended template name.
The cap system controls how many raid bases can exist at once.
The current cap layout is:
"caps": {
"cap_enforcement": {},
"cluster_cap": {},
"group_caps": {},
"map_caps": {}
}map_caps limits active bases per map.
Example:
"map_caps": {
"enabled": true,
"default_max_active": 1,
"include_pending_spawns": true,
"maps": {
"island": 1,
"center": 1,
"rag": 1
}
}| Field | Meaning |
|---|---|
enabled |
Enables the new map cap system |
default_max_active |
Default cap for maps not listed |
include_pending_spawns |
Counts pending spawn attempts toward the cap |
maps |
Per-map cap overrides |
cluster_cap limits total active bases across enabled maps.
Example:
"cluster_cap": {
"enabled": false,
"max_active_bases": 5,
"include_pending_spawns": true,
"only_enabled_maps": true,
"only_enabled_bases": true,
"override_group_caps": true
}| Field | Meaning |
|---|---|
enabled |
Enables the cluster-wide cap |
max_active_bases |
Maximum active bases across the cluster |
include_pending_spawns |
Counts pending spawns toward the cap |
only_enabled_maps |
Only counts maps enabled in AutoBases config |
only_enabled_bases |
Only counts templates enabled in AutoBases config |
override_group_caps |
If true, group caps are ignored while cluster cap is enabled |
group_caps allows custom caps using exact templates, tags, maps, or plugin spawn groups.
Example:
"tier2_raids": {
"enabled": true,
"label": "Tier 2 Raid Bases",
"max_active": 3,
"include_pending_spawns": true,
"tags": [
"tier2"
],
"spawn_groups": [
"Tier2"
]
}| Field | Meaning |
|---|---|
templates |
Exact base/template names |
tags |
Template tags from the map template config |
maps |
Map keys, such as island, rag, or center |
spawn_groups |
Plugin group names used by ab.spawnrandomgroup |
spawn_groups must match the Auto Bases Ascended plugin group name.
Example:
ab.spawnrandomgroup Tier2
would use:
"spawn_groups": [
"Tier2"
]Tags work best when the bot knows the exact template name.
spawn_groups are important for scheduler/random group spawns because the plugin picks the final template after Bob sends the command.
cap_enforcement controls cleanup when something is over cap.
Example:
"cap_enforcement": {
"enabled": true,
"mode": "log_only"
}| Mode | Behavior |
|---|---|
log_only |
Detect over-cap bases but do not delete |
destroy_newest |
Delete newest overflow bases first |
destroy_oldest |
Delete oldest overflow bases first |
For first-time setup, log_only is safest.
Use destroy_newest only after confirming the caps are configured correctly.
Cap enforcement can apply to:
- map caps
- cluster cap
- group caps
This allows the bot to clean up over-cap bases after a config change, startup resync, manual resync, or unexpected plugin behavior.
The scheduler can run in two modes.
| Mode | Meaning |
|---|---|
per_map |
Each enabled map has its own spawn interval |
cluster |
One cluster-wide timer chooses an eligible map by weight |
Example:
"scheduler": {
"mode": "per_map",
"tick_seconds": 60,
"spawn_retry_timeout_seconds": 120,
"startup_resync": true,
"cluster_spawn_interval_minutes": 120,
"periodic_resync_minutes": 15,
"spawn_retry_attempts": 3
}| Field | Meaning |
|---|---|
mode |
per_map or cluster |
tick_seconds |
How often the scheduler checks eligibility |
spawn_retry_timeout_seconds |
How long to wait for spawn confirmation |
startup_resync |
Resync active bases when the bot starts |
cluster_spawn_interval_minutes |
Cluster-wide spawn interval when using cluster mode |
periodic_resync_minutes |
How often to resync active bases |
spawn_retry_attempts |
Number of spawn attempts before giving up |
Auto-wipe removes active bases after a maximum age.
Example:
"auto_wipe": {
"enabled": false,
"max_age_minutes": 4320,
"check_interval_minutes": 60,
"start_cooldown_after_wipe": true,
"public_expired_embed": true,
"ping_on_expired": false
}4320 minutes is 3 days.
| Field | Meaning |
|---|---|
enabled |
Enables automatic wiping of old bases |
max_age_minutes |
Maximum allowed base age |
check_interval_minutes |
How often the bot checks for expired bases |
start_cooldown_after_wipe |
Starts map cooldown after auto-wipe |
public_expired_embed |
Posts/updates an expired-base Discord embed |
ping_on_expired |
Pings the configured alert role on expiration |
Public Discord raid announcements are configured under:
"public_discord_announcement": {}This controls active, completed, expired, and attack-related public raid posts.
Common settings:
"public_discord_announcement": {
"enabled": true,
"announcement_channel_id": 0,
"ping_role_id": 0,
"use_alert_role_as_ping_fallback": true,
"delete_completed_after_minutes": 60,
"ping_on_active": true,
"ping_on_completed": true
}Use base_details or the legacy public_raid_details.bases section to add extra details to public raid embeds.
Preferred layout:
"base_details": {
"Example Raid Base": {
"sections": [
{
"title": "Raid Rules",
"lines": [
"Destroy the vaults or generators to complete the raid."
]
}
]
}
}The key must match the exact template/base name.
Alert role buttons allow users to join or leave a Discord alert role.
Example:
"alert_role_buttons": {
"enabled": true,
"message_id": 0,
"title": "💥 Raid Base Alerts",
"description": "Use the buttons below to join or leave raid base alert pings.",
"join_button_label": "Join Raid Alerts",
"leave_button_label": "Leave Raid Alerts",
"button_panel_channel_id": 0,
"alert_role_id": 0
}The bot role must be above the alert role in Discord and must have Manage Roles permission.
The Boss Events Controller is configured under:
"modules": {
"boss_events": {}
}Enable it with:
"enabled": trueThis module expects:
- ServerEventsAscended installed/configured on the ARK server
- RCON enabled
- valid server entries under
servers - spawn pools with valid event names and coordinates
- optional Discord feed channel for ServerEventsAscended event messages
| Command | Description |
|---|---|
/boss status |
Show Boss Events module status |
/boss config |
Show readable boss event config |
/boss active |
Show active/locked boss events |
/boss spawn |
Spawn a configured boss event pool |
/boss cancel |
Cancel a server event |
/boss clear |
Clear a local active boss lock |
/boss alert_buttons |
Create or update boss alert role buttons |
Boss spawn pools define which events can be spawned and where.
Example:
"spawn_pools": [
{
"name": "Example Boss Event - Ragnarok",
"enabled": false,
"command_mode": "start",
"event_name": "ExampleBossEvent",
"servers": [
"rag"
],
"coords_by_server": {
"rag": [
"0 0 0"
]
}
}
]| Field | Meaning |
|---|---|
name |
Friendly pool name shown in slash commands |
enabled |
Enables this spawn pool |
command_mode |
start or startrandom |
event_name |
Event name used with ServerEventsAscended.start |
event_type |
Event type used with ServerEventsAscended.startrandom |
servers |
Server keys where this pool can spawn |
coords_by_server |
Spawn coordinates per server |
| Mode | Meaning |
|---|---|
start |
Uses event_name with ServerEventsAscended.start |
startrandom |
Uses event_type with ServerEventsAscended.startrandom |
Boss Events uses local active locks so the bot knows an event is in progress.
Example:
"active_event_tracking": {
"enabled": false,
"active_lock_minutes": 90,
"block_timer_while_active": true,
"spawn_verify_timeout_seconds": 10,
"startup_resync_message_limit": 100,
"announce_feed_updates": false,
"server_events_feed_channel_id": 0
}| Field | Meaning |
|---|---|
enabled |
Enables feed-based active tracking |
active_lock_minutes |
How long an active lock lasts without completion |
block_timer_while_active |
Blocks scheduled boss spawns while an event is active |
spawn_verify_timeout_seconds |
Time allowed for feed confirmation |
startup_resync_message_limit |
Number of feed messages to inspect on startup/resync |
announce_feed_updates |
Posts feed tracking updates to Discord |
server_events_feed_channel_id |
Channel containing ServerEventsAscended feed messages |
Boss public announcements use:
"public_discord_announcement": {
"enabled": false,
"announcement_channel_id": 0,
"ping_role_id": 0,
"use_alert_role_as_ping_fallback": true,
"delete_completed_after_minutes": 60
}Boss in-game announcements use:
"cluster_announcement": {
"enabled": false,
"rcon_command": "ServerChat",
"announce_to_all_servers": true,
"announce_on_event_started": true,
"announce_on_event_complete": true,
"announce_on_event_canceled": false
}Boss alert buttons work the same way as AutoBases alert buttons.
Example:
"alert_role_buttons": {
"enabled": false,
"message_id": 0,
"title": "⚔️ Boss Event Alerts",
"description": "Use the buttons below to join or leave boss event alert pings.",
"join_button_label": "Join Boss Alerts",
"leave_button_label": "Leave Boss Alerts",
"button_panel_channel_id": 0,
"alert_role_id": 0
}The bot role must be above the alert role in Discord and must have Manage Roles permission.
If Discord shows stale slash commands:
- Run:
/nexus refresh_commands
- Reload Discord with:
Ctrl + R
- Restart the bot if module enable/disable settings changed.
Normal config value changes usually only need:
/nexus reload
state.json stores runtime data such as:
- dashboard message IDs
- alert role button message IDs
- active AutoBases state
- active Boss Events locks
- public Discord message IDs
- recent activity logs
Do not publish a live state.json.
For a fresh setup, use:
copy state.blank.json state.jsonBobBot Nexus includes a notify-only update checker.
The bot does not replace files automatically.
Use:
/nexus update_check
to check for a newer release.
If an update is available, download it manually and replace the program files while preserving your own:
config.json
state.json
Always back up your config before updating.
Copyright © 2026 TreeScout / Battered Bobs. All rights reserved.
BobBot Nexus, including the AutoBases Controller, Boss Events Controller, configuration structure, documentation, command logic, and related files, is provided for personal or authorized server-owner use only.
You may use this tool to run and manage your own ARK: Survival Ascended server or cluster.
You may not sell, redistribute, re-upload, rebrand, reverse engineer, decompile, modify for resale, or claim this project or any part of it as your own without written permission from the original author.
Configuration files may be edited for personal server use. Public example configuration files are provided only as setup references and do not grant ownership or redistribution rights to the bot source code or compiled executable.
This project is not affiliated with, endorsed by, sponsored by, or officially connected to Studio Wildcard, Snail Games, Discord, Auto Bases Ascended, Server Events Ascended, ArkApi, or any other third-party plugin or service referenced by this project. All trademarks and game/plugin names belong to their respective owners.
Use of this bot is at your own risk. The author is not responsible for server downtime, lost data, accidental base deletion, misconfigured RCON access, plugin conflicts, Discord permission issues, or damage caused by improper setup or use.