Troubleshooting
Start with:
/shitbot statusRecord the platform, server version, Java version, and complete console logs around the problem.
OneBot stays disconnected
Check that:
- OneBot v11 forward WebSocket is enabled.
- The protocol, address, and port in
onebot.websocket-urlare correct. access-tokenmatches OneBot.127.0.0.1refers to the machine running ShitBot, not a different OneBot host.- Cross-host connections use
wss://; remotews://is rejected by default. - Java trusts the
wss://certificate. - The firewall permits the Minecraft instance to connect to OneBot.
- The OneBot implementation supports v11 forward WebSocket.
QQ commands get no reply
Check that:
- The group is in
onebot.allowed-group-ids, orallow-all-groupsis deliberately enabled. - OneBot reports a group message event.
onebot.commands.<feature>.enabledis on.- The input matches an alias in the selected language file. English aliases require
language: "en_US". - The command is not on cooldown.
- The bot can send group messages and images.
/shitbot statusreports a healthy database and OneBot connection.
#qq or #mc does not forward
Each direction has its own switch:
forwarding:
game-to-group:
enabled: true
group-to-game:
enabled: trueWith require-prefix: true, include the entire prefix, including its trailing space. Game-to-QQ destinations come from allowed-group-ids.
A bound player is still blocked
Check that:
- The Minecraft ID in the QQ command exactly matches the actual name, including case.
- The binding command uses the latest code generated for this login attempt.
- The code has not expired.
- The QQ account has not exceeded
maximum-ids-per-qq. - The proxy and backends share the same MySQL database.
- The player's binding exists in the database.
- Database charset, collation, and schema have not been manually altered.
Database connection fails
For SQLite:
- The plugin data directory is writable.
- No other process is opening the shared file.
- Enough disk space is available.
For MySQL:
- Address, port, database, username, and password are correct.
- The account has permissions on the target database.
- Remote connections use
sslMode=VERIFY_IDENTITY. - Java trusts the database certificate.
- The server can reach
repo.maven.apache.org, or a compatible JDBC driver is available. - The firewall and MySQL bind address permit the connection.
The proxy reports no available backend
Check that:
- Backend Spigot uses
deployment.role: "backend". - Its listener is enabled.
- The endpoint name matches the backend's
server-name. - Address, port, and token agree on both sides.
- The token has at least 16 characters.
allowed-proxy-addressescontains the actual proxy IP.- Cross-machine connections use TLS or an explicitly allowed encrypted tunnel.
- The firewall allows only the proxy to access the listener.
- Proxy and backend system clocks are correct.
See Proxies and backend servers.
A shortcut reports no permission
- The sender must have a bound character unless
allow-unboundis explicitly enabled. - The character must have the shortcut's
permission. - Offline checks need LuckPerms, Vault, or available offline OP information.
- Proxy-local and backend commands use different platform permission systems.
- An empty
permissionskips game permission checks; it does not automatically allow unbound QQ accounts.
Inventory snapshots or textures are missing
- The player must have joined a backend responsible for snapshots at least once.
inventory.enabledmust be on.- All network instances must share MySQL.
- The renderer must be able to read resource packs, client JARs, or exported icons.
- Old snapshots may need a new login to capture new fields and player head data.
See Inventory queries and textures.
Chinese text in images is broken
Install the fonts selected by image.font-name and inventory.font-name. Linux usually does not include Microsoft YaHei; install a font or select an available Chinese font.
Advanced templates fail to start
First decide whether you need the advanced system. If not, keep custom-image-templates.enabled: false and image.renderer: "java".
Otherwise, check that:
image.renderer: "custom"is paired with the advanced-template switch being enabled.- With
debug: true,components/image-renderer/<version>/ShitBotRenderer-<version>.jarexists in the plugin data directory with valid metadata and version. Debug mode does not download it or require.sha256and.sig. - With
debug: false, the release includes the matching renderer JAR, checksum, and signature. - With
debug: false, the server can access GitHub release download hosts. - With
debug: false,components/image-renderer/<version>/is writable and cached files have not been manually replaced. - Download size, assets, canvas, pixels, layers, loops, rendering time, and queues remain within limits.
- The template is published and its ID in
image.custom-templateor the group command is correct. - Remote images are enabled. If an old configuration still has
custom-image-templates.remote-images.enabled: false, change it totrueand reload before using HTTPS avatars/images. The default online template also needsimage.avatar.enabled: trueto supply avatar URLs. - PAPI templates have PlaceholderAPI on the Spigot backend, an online player, and correct endpoint/
target-serversettings.
If the editor does not open, enable editor.enabled: true and run /shitbot editor again for an unused login URL. Reverse proxies must use HTTPS and preserve the original Host; keep the internal listener on loopback.
Reload fails
The old runtime stays active when /shitbot reload fails. Find the earliest configuration or connection error in the console, fix it, and reload again.
Restart directly after:
- Replacing the plugin JAR.
- Changing Java or server software.
- Replacing TLS key stores or trust stores.
- Changing underlying networking, firewall, or database services.
Still unresolved
Open a GitHub issue with:
- ShitBot version.
- Platform and server version.
- Java version.
- Standalone, proxy, or proxy/backend deployment.
- Logs with tokens, passwords, database addresses, and private player data removed.
- Reliable reproduction steps.
Do not ask for ShitBot support in LLBot groups.