📢 PhantomBot v3.8.0.0 is now available as a stable build.
⚠️ New scopes are required for the Broadcaster OAuth to track followers
✅ Added:
➡️ Added methods to TwitchCache ($.twitchcache
) to retrieve the follower count, Affiliate status, Partner status, subscriber count, and subscriber points of the streamer (gmt2001)
➡️ Added a timer to output the follower count, subscriber count, subscriber points, and viewer count to filed in the addons folder periodically (gmt2001)
➡️ Added a new event to bind twitchBroadcasterType when a change in Affiliate/Partner status occurs, or is detected for the first time after startup (gmt2001)
➡️ Added a new event to bind eventSubDisconnected when the EventSub socket disconnects outside of a reconnect event (gmt2001)
➡️ Added support for the new scoped Get Channel Followers endpoint (gmt2001)
➡️ Added support for the EventSub channel.follow topic and associated eventSubChannelFollow hook (gmt2001)
➡️ Added a new property to botlogin.txt pullallfollowers=false
. If set to true
, the 50k limit is removed from FollowerCache and a full update of all followers will be tracked on the next startup. ⚠️ Will take a very long time (gmt2001)
➡️ Added additional methods for checking follower statuses to FollowersCache and exported it to the JS global $.followers
(gmt2001)
➡️ Added an optional 3rd parameter to $.bind(string hookName, function handler, bool always)
. When always
is set to true
, the hook will run even if the script is disabled. Default false
(gmt2001)
➡️ Added additional methods to PredictionBegin, PredictionEnd, PredictionLock, PredictionProgress, and StreamOnline to get the available timestamps as a raw RFC3339 string (gmt2001)
➡️ Added the ability for H2Store to create periodic backups (gmt2001)
➡️ Added the ability to restore from an H2Store backup by shutting down the bot, deleting the database, then copying in the backup without changing the filename (gmt2001)
➡️ Added JavaDoc for DataStore ($.inidb
) (gmt2001)
➡️ Added helper function $.sql
which has the same parameters as Datastore.executeSql but auto-converts DQL results into proper JS arrays of JS strings (gmt2001)
➡️ Added a new property to botlogin.txt mysqlssl=false
. If set to true
, SSL is used to connect to MySQL when using MySQLStore (gmt2001)
➡️ Added support for the new Get Chatters endpoint (gmt2001)
➡️ Added Viewer Cache ($.viewer
), which takes over the functions of UsernameCache, ViewerListCache, updates to $.users
using the new Get Chatters endpoint, tracking active members of chat, and tracking Twitch login name changes (gmt2001)
➡️ Added a new event to bind twitchUserLoginChanged when the bot notices a user changed their Twitch login name. ⚠️ The bot must see the users old Twitch login name through one of the functions of ViewerCache before this will work (gmt2001)
➡️ Added new command tag (nl)
which is replaced with \n
, allowing multi-line custom commands to be created, even from chat (gmt2001)
➡️ Added a toggle !botname togglecustomcommandat
which globally toggles the feature allowing a custom command with no tags to be targeted at another user by a mod using !mycommand @user
. In the panel the setting is located at Settings > Bot > Message Output (gmt2001)
➡️ Exposed $.handleException(string where, ExceptionOrError ex)
, which handles logging and console output for a Java Exception or JS Error. The where
parameter is a programmer-defined string to more helpfully define where the error was caught (gmt2001)
➡️ Added the ability to specify @all
as the target for !enablecom
or !disablecom
, which will enable/disable all commands except for !enablecom
, !disablecom
, and those created with !addcom
. ⚠️ This will also enable/disable hidden commands used by some panel functions (gmt2001)
➡️ Added $.listCommands()
, which returns a list of all Twitch commands registered by $.registerChatCommand
(gmt2001)
➡️ Added $.listSubCommands(string command)
, which returns a list of all Twitch sub-commands of the specified command registered by $.registerChatSubCommand
(gmt2001)
➡️ Added support for the EventSub channel.channel_points_custom_reward_redemption.add topic and associated eventSubChannelPointsCustomRewardRedemptionAdd hook (gmt2001)
➡️ Explicitly added the MESSAGE_CONTENT
privileged intent to Discord connections (gmt2001)
🌀 Changed:
➡️ Updated dependencies: SQLite 3.41.0.0, H2 2.1.214, Rollbar 1.10.0, commons-codec 1.15, commons-io 2.11.0, commons-text 1.10.0, JSON 20230227, Discord4J 3.2.4 (gmt2001)
➡️ Updated the Java binaries to the latest release of JRE 11 (gmt2001)
➡️ Changed H2 to be the default database for new installations (gmt2001)
➡️ Changed channelPointsHandler and predictionHandler to silently drop commands to access the API if Affiliate/Partner status is not detected (gmt2001)
➡️ Changed (customapi)
to provide improved logging of failures (gmt2001)
➡️ Changed TwitchCache to not update Title/Game/Online/Offline status from the API if EventSub is currently working for these items (gmt2001)
➡️ Changed FollowersCache to use the new Get Channel Follows endpoint (gmt2001)
➡️ Changed FollowersCache to grab up to the first 50k followers on the first startup after this update, and to catch up on up to 50k missed followers for every startup thereafter. These do not trigger alerts or give points (gmt2001)
➡️ Changed swappedSubscriberVIP to default to true
on new installations, placing VIPs on a higher permission level than subs (gmt2001 gmt2001#202)
➡️ Changed the script loading system to be more flexible in bootstrapping the JS environment (gmt2001)
➡️ Changed event handling in JS so that any events which fire before all scripts have loaded are held in queue until initReady
has fired (gmt2001)
➡️ Changed the SSL load routine to recognize a potentially corrupt Auto-SSL certificate and regenerate it (gmt2001)
➡️ Changed the Auto-SSL generation routine to improve the reliability of regenerating the certificate (gmt2001)
➡️ Changed channelPointsHandler to use the EventSub subscription instead of PubSub (gmt2001)
➡️ Changed Discord to fail immediately if any privileged intents are rejected, instead of retrying without them (gmt2001)
➡️ Changed the setup-mode re-check interval to max out at 60 seconds (gmt2001)
🛠️ Fixed:
➡️ Fixed an NPE that could occur when noticeSystem was loading if some values where missing (gmt2001)
➡️ Fixed SQLite availability detection not catching UnsatisfiedLinkError (gmt2001)
➡️ Fixed HttpClient not following HTTP 3xx redirects (gmt2001)
➡️ Fixed EventSub not triggering stream offline due to a missing parameter (gmt2001)
➡️ Fixed an issue where WSClient could cause an NPE when closing the connection (gmt2001)
➡️ Fixed an issue where the legacy HttpRequest class would not catch exceptions that occur during an HTTP response (gmt2001)
➡️ Fixed an issue where an escaped opening \(
or closing \)
parenthesis would not be interpreted as escaped in command tags under certain conditions (gmt2001)
➡️ Fixed an issue where methods that iterated over the available transformers performed the iteration incorrectly (gmt2001)
➡️ Fixed an issue where the Logger was not updating its timezone after saving from the Bot Setup page (gmt2001)
➡️ Fixed an issue where the (age)
tag threw a ReferenceError due to accessing the variables incorrectly (gmt2001, reported by abraxas86 #3120)
➡️ Fixed an issue where the YouTube Playlist Viewer did not work due to incompatible scripts and incorrect resource URIs (gmt2001)
➡️ Fixed an issue where the OAuth page was still showing the selector for Both or Separate Broadcaster authorizations, while logged in using the Broadcaster-only token (gmt2001)
➡️ Fixed an issue where the Datastore.executeSql method did not support DDL and DML statements (gmt2001)
➡️ Fixed an ArrayIndexOutOfBoundsException that could occur when performing a POST to the bots webserver where a form input contained a key but no =
or value (gmt2001)
➡️ Fixed an ArrayIndexOutOfBoundsException that could occur when parsing cookies sent to the bots webserver where a cookie contained a key but no =
or value (gmt2001)
➡️ Fixed an issue where $.jsString
sometimes failed to convert a value (gmt2001)
➡️ Fixed an issue where donationHandler did not support a no-message donation (gmt2001)
➡️ Fixed an issue where a non-existent method was called when mapping base Java methods to JS (gmt2001)
➡️ Fixed an issue where an NPE was thrown when trying to subscribe to EventSub while the connection is closed (gmt2001)
➡️ Fixed an issue where !mute
would also mute the success message stating that mute was enabled (gmt2001)
➡️ Fixed the copy button on the overlay URL generator on the panel not working (gmt2001)
➡️ Fixed a memory leak on the alerts overlay page when using audio hooks (gmt2001 #3134)
➡️ Fixed an issue where SQLiteStore would load the SQLite library into memory when it was not needed (gmt2001)
➡️ Fixed an issue where the (touser)
tag threw a ReferenceError when used in a Discord command due to accessing the variables incorrectly (gmt2001)
➡️ Fixed an issue where the (nl2br)
, (nl2x)
, and (url0a2nl)
tags threw a ReferenceError due to using the wrong replace function (gmt2001)
➡️ Fixed an issue where the names of players in an adventureSystem heist were not stored properly, leading to a failure to block the same user from joining the heist multiple times (gmt2001)
➡️ Fixed an issue where the bot webserver login page would drop all query parameters that should be passed to the target page after a successful login (gmt2001)
➡️ Fixed an issue where the OAuth page did not support displaying OAuth authorization errors returned by Twitch (gmt2001)
➡️ Fixed an issue where JSFileSystem would not automatically create necessary directories when trying to create/move/touch a file/directory (gmt2001)
➡️ Fixed an NPE when shutting down the bot if EventSub does not have an open connection (gmt2001)
➡️ Fixed an NPE on startup if owner=
is not set in botlogin.txt (gmt2001)
➡️ Fixed TwitchCache not being able to recover if it initially failed to startup its timers due to a missing or invalid API OAuth (gmt2001)
➡️ Fixed an NPE in WSClient when attempting to send a frame under certain conditions (gmt2001)
➡️ Fixed an issue where an exception caught in AbstractTMIProcessor could cause further messages to stop processing, causing an infinite reconnect loop (gmt2001)
➡️ Fixed the panel not having a default permission group mapping, in case loading from the bot is taking some time (gmt2001)
➡️ Fixed an issue where some users are able to receive messages from Discord, but not send messages, commands, and queries back (gmt2001)
➡️ Fixed an issue where the OAuth page would sometimes display the token type as null
(gmt2001)
➡️ Fixed an issue where the panel would not load if an API OAuth was not set due to being unable to load the display name of the broadcaster (gmt2001)
🗑️ Deprecated:
➡️ Multiple Java classes and methods are Deprecated for removal. Information can be found on the JavaDoc Deprecated List page
🛑 Removed:
➡️ Removed the fixfollowedtable
console command (gmt2001)
➡️ Removed instant update of $.users
by events outside of Get Chatters, such as a user sending a message in chat (gmt2001)
🐞 Known Issues:
➡️ No known issues
🌐 Download It:
➡️ Downloads attached to the bottom of this release notice
❗ Remember to install to a separate folder, then copy over the config dir, as well as any custom scripts or files in addons
➡️ PhantomBot official builds are available on GitHub Container Registry at ghcr.io/phantombot/phantombot and ghcr.io/phantombot/nightly-build
➡️ PhantomBot official builds are available on DockerHub at gmt2001/phantombot-stable and gmt2001/phantombot-nightly. See the readme text on the appropriate Docker Hub pages for Docker Compose files
🗒️ Notes:
➡️ We have guides on PhantomBot. You can contribute by submitting a Pull Request adding or editing .md files in the /docs/guides/content folder of the repo. See the guides for info about formatting.