Releases: EvoEsports/minicontrol
MINIcontrol 0.10.0
This release focuses on improving responsiveness under heavy traffic, reducing event loop blocking, and streamlining multi-call and UI display code for better overall performance and reliability.
This is probably the last big point release version before releasing MINIcontrol 1.0.0.
0.10.0 has been a long time in the making and has been battle tested during the Kacky spinoff event, which helped @reaby figure out many performance shortcomings and fixes for them. Huge props for this massive release to him!
Check out the full changelog below:
Core
Code in the core was refactored to use consistent double quotes for string literals across multiple files
We also added a versioning script and added a version.json
file for build tracking (will be used starting from next build for update checks)
Improved XMLRPC Query Handling
– Revised the query method to better handle both waiting and non‐waiting calls by registering dummy callbacks so that responses are properly discarded
– Updated header/handle management to avoid race conditions and ensure consistent payload creation
– Added performance counters for debugging XMLRPC traffic, queries and callbacks
– TCP buffer now waits to drain on write to stabilize XMLRPC connection
Enhanced Socket & Data Processing
– Modified the handleData
loop to yield control periodically (using setImmediate
) so that heavy bursts of responses no longer block the event loop
– Added progress checks in the data loop to prevent infinite loops when incomplete messages arrive
Optimized Multi‐call and Send Queue Mechanism
– Refactored the flushSendQueue routine to use a self-scheduling timeout (with chunking) instead of setInterval
, avoiding overlapping flushes
– Batching of send calls via multisend was improved to reduce serialization overhead and prevent the send queue from filling inaccurately
– Implement block callbacks for Trackmania to reduce XMLRPC calls for 100+ players
– Refactored script method calls in GbxClient
and Server - callScript
now returns the answer with 1 second timeout, added sendScript
method for improved handling
UI Manager Enhancements
– Redesigned displayManialink
(s) methods to handle public and player-specific Manialinks more efficiently, ensuring older or duplicate manialinks are cleaned up properly
– Consolidated common code paths and improved asynchronous processing for rendering and sending Manialink XML payloads
– Fixed memory issues with handling Manialinks
Plugin System & Overall Stability
– Upgraded plugin dependency checking and loading/unloading logic, ensuring plugins are loaded only if dependencies are met (and cleaned up correctly during unload, unload still disabled)
– Various performance improvements and bug fixes across the system to improve responsiveness and stability under high load
– Change to use exact plugin name instead startingOf when using EXCLUDED_PLUGINS=
environmental variable
Database
- Added fixes for xaseco migrator
- Add tables:
sectors
,personalBest
- Add indices to safeguard uniqueness on tables with uuid and login
- Add few new fields for
player
andmaps
tables
Managers and Settings
- Add
//colors
to settings, adds color:¤db¤
- Added a
widgets.performance
setting with a default value of 35 players, if there's more players than the configured value thecheckpoint widget
andsector records widget
stop sending updates andrecords widget
changes to public updates only. - Add settings for TMNF HUD elements
- Fixed issues with player and map management.
- Fixed command manager to ignore case for chat command
- Add
tmc.maps.getTimeInfo()
to get timings info about maps - Fixed UTF-8 error on Manialink multicall when joining server
- fixed
htmlentities
to escape full UTF-8 range - Add
GetAllLogins()
to playerManager - Add
GetCountryFromPath(path)
to utils.ts - Fixes
//addlocal
to work with Windows host systems - Adds
//plugins
to show enabled/disabled plugins
Plugins
Announces
- Announces now show custom nicknames
- Added settings for new and improved record thresholds
- Added new/equal/improvement messages for dedimania
Chat
- Introduced a profanity filter and improved chat functionalities.
- Adds admin badge
- Add announce message for celyan's emotes support
- Include +++ and --- as valid karma vote
- Use customNick instead of just normal nickname
- Autolink urls: surrounds urls with
$l
- Update TMNF emotes support to version 2025-04-25
Database
- Added
totalPlaytime
andconnectCounters
- Added
/active
and/topactive
commands to show playtime - Fixed: Adding customNick to player objects on connect
Dedimania
- Fixed Dedimania reconnect on failure
- Fixed Dedimania widget + made dedimania widget enabled by default (add
widgets/dedimania
toEXCLUDED_PLUGINS
to disable) - Fixed comparison logic to allow equal times
- Fixed Dedimania map uid validation
- Fixed Dedimania announce that you beat "0." record when you equal last dedimania record
DebugTool
- Enhanced memory management with safeguards against excessive memory usage
- Add performance counter: update every 5 seconds when
DEBUG_GBX_COUNTERS=true
- Adds .env variable
DEBUG_GBX
- when true, shows GBX callbacks
Menu
- Menu was rebuilt and redesigned from scratch
Maplist
- Fixed searching by author
- Added
/list nofinish
and/list finish
- Added [remove] button for admins
Sectors
- Added
/sectors
command - Added
//sectors delmap
and//sectors delall
- Sector records are now cached at runtime and only saved to the database at the end of a map for performance improvements
Records
- Postponed registering of events onStart and after reading records and fix for out-of-range check for record, which will fix the duplicate constrain errors for database
- Personal bests are now cached at runtime and only saved to the database at the end of a map for performance improvements
- Enhance sorting on exact same time driven for records widget
Votes
- Added color
¤vote¤
for vote messages - Fixed time limit reset on extends
- Added restart vote
/restart
MINIcontrol 0.9.0
Important
This release includes the first version of MINIcontrol's new SettingsManager.
Many settings previously configured via .env
or Environment Variables have been moved to the settings manager, you will have to set the proper values there again.
New features
- Added Setings Manager, available via
//settings
Attention Developers: Going forward, adding plugin settings to.env
is deprecated.
Please see documentation on how to expose your plugins settings for the settings manager. - Added TMX world record data to current map widget.
- Added settings whether locals/dedis/player joins should be announced in chat or not
- Added Admin panel widget - can be disabled in the settings manager
/help
and//help
now display in a beautiful UI window instead of in chat
Bug fixes and improvements
- Fixed Maplist Fetch Rank when MINIcontrol is using a MySQL database
- Dedimania should no longer block MINIcontrol starting up if it is slow to respond
- Added a 1 second timeout to TMX info fetcher - can be disabled in the settings manager
- Fixed an issue with extending a map's timelimit when the ATime plugin is enabled
Other notable changes
//call
is moved from Admin plugin to MINIcontrol's core, meaning it will work without the admin plugin active- Using
//call
without parameters now shows a help window - Chat colors as well as badge colors (default red for admins) can now be changed in the settings manager.
WorldRecords
plugin has been moved totm2020
namespace.LiveRecords
plugin has been renamed toLiveRankings
Developer improvements
- TMNF Custom UI now has a better API, you can access it via
tmc.ui
- Fixed an issue with
ListWindow
propagation
MINIcontrol 0.8.1
Bug fixes and improvements
- Fixed
"
and'
characters in nicknames, mapnames, etc not being properly escaped, causing issues in widgets and UI windows - Fixed non-working /players window
- Fixed Live Records not working without database
- Several small bug fixes for Records and LiveRecords modules
- Updated package dependencies for
mysql2
andsentry.io
- requiresnpm install
if not running via Docker - Updated server admin and developer documentation
- Removed unused scripts from
package.json
MINIcontrol 0.8.0
Happy 1 year anniversary to MINIcontrol!
On December 28 2023 @reaby started with the development of a small, modular controller for TMNF, TM2 and TM2020... and so, MINIcontrol was born.
We're thankful to everyone reporting bugs, sharing feedback, requesting new features and helping us improve the controller for you, the community.
Just in time for the anniversary, we've prepared a major new update.
See the changelog below for more information and see you in 2025 for more updates coming your way!
Important
Due to changed dependencies, server admins who run MINIcontrol outside of docker need to run npm install
again after upgrading to this version.
New features
- [TMNF] UI has received a bit of a facelift
We're quite happy with where MINIcontrol's User Interface design is at now, so don't expect too many drastic changes in this regard - [TMNF] Added support for Celyan's Emote Mod
- [TMNF] Added missing legacy methods for changing Rounds, Team and Cup game mode settings
- Added a fix for the "Cannot connect to server: already connected" dedicated server bug
- Added the ability to search (T)MX for maps via
//search
command - Added new admin commands to view and clear contents of
BanList
,BlackList
,GuestList
andIgnoreList
Bug fixes and improvements
- [TMNF] Clicking the "Add To Favorites" widget now no longer disconnects you from the server
- [TMNF] Fixed the TALimit plugin to not start the timer during Warmup
Other notable changes
- Due to technological difficulties, we've disabled the plugin manager and the ability to load/unload plugins during runtime for now
- Increased Event Listener limit from 50 to 100 per event - this should improve the ability of server owners to run many many plugins at the same time
- Fixed some Typescript types in the migrations
- [Plugin Development] Deprecated the usage of
escape()
in the project - please usehtmlEntities()
instead - [Plugin Development] [TM2020] Added
tmc.ui.setClipboard(login,contents);
for setting a player's clipboard content - use this wisely - [Plugin Development] Excluded
node_modules
from VSCode Workspace - [Plugin Development] Renamed all templates from
.twig
to.xml.twig
to enhance compatibility between IDEs
MINIcontrol 0.7.1
MINIcontrol 0.7.0
New features
- Added/changed plugin - WorldRecords - Live Rankings, Local Records and World/Dedimania records in one widget
- Added support for TM2020 Leaderboards in Records widget
- Added plugin - Pay2Play - allows you to define a copper/planets amount for requeueing or skip the current map
- Added plugin - Add Server To Favorites - self-explanatory
- Added feature - Sentry Error Reporting - automatically sends anonymized error reports to Sentry.io for us to analyze
To opt-out of error reporting, setERROR_REPORTING=false
in your .env file. - Added command - /checkpoints shows additional information from the BestCPs widget
- Added PyPlanet migration script to allow you to easily migrate from existing PyPlanet installations (MP/TM2020 only)
Bug fixes and improvements
- Several small bug fixes and improvements to stability of MINIcontrol
Important note
- MINIcontrol now requires a NodeJS version of at least 21.5.0. We recommend you use the latest LTS version.
MINIcontrol 0.6.1
General bug fixes and improvements
- Chat commands like /extend should work properly again
- New widget and window style
- Dedimania records now get announced in chat
- [TM2020] Moved built-in Laps and Checkpoint counter to the bottom right
Developer improvements
- You can now use class aliases again in your plugins - e.g.
@core
MINIcontrol 0.6.0
General bug fixes and improvements
- Fix checkpoint counter becoming desynced from player state
- Fix server authentication when dedicated server
User
password is non-default - Fix //talimit not working in TMForever and other improvements for TM2020
- Adding maps via TMX has been improved by fetching map details from the dedicated server instead of relying on the TMX api.
- TM2020 records widget has been reduced in size and several native UI widgets are now hidden by default as MINIcontrol replaces them.
- Admins can now write in chat even if public chat is disabled
Map parsing changes
- Improved error handling for map parsing - thanks @tomek0055
//addlocal
command and manialink window has been sped up by only parsing the map headers instead of the full map files- Fix map headers sometimes containing odd characters due to bad latin-1 -> utf-8 encoding
New commands and plugins
- New commands:
//requeue
and//prev
- Lets admins restart the map after it ends and go back to the previous map - thanks @MRegterschot - New plugin:
ATime
- Lets admins set a dynamic timelimit based on the AuthorTime of the next map and a configurable multiplier - New plugin:
nadeocloud
(TM2020 only) - Allows campaign downloads from Nadeo's infrastructure - thanks @MRegterschot
Developer improvements
- Added
.editorconfig
file for IDEs that support it - Folders that start with a dot now are no longer recognized as plugins, so MINIcontrol finally stops trying to load the
.git
folder - Plugins can now install their own dependencies via
node_modules
Note: You must set the plugin'spackage.json
to usetype: "module"
or the plugins won't load - Improved the
meminfo
debug display. It now shows a diff compared to the start value, not the last value - Command manager now allows for spaces in commands, e.g.
/jukebox drop
Note: Commands with spaces cannot share their first "argument" with another command, as those would override a command containing a space.
MINIcontrol 0.5.0
Breaking changes
- Changed license to GPL3 due to usage of LZO library to parse track files.
- Add new
tmnf/forcemods
plugin which replacestmnf/ui
Minor changes
- Add Environment / Car parsing to
/list
(requiresdatabase
plugin to be enabled) - Add new
/list
styling. (Not final, please give us your feedback) - Map Queue (available via
/jb
) is no longer part of the Maps list (available via/list
) and is now a separate plugin. - Added new admin command
//chat <on/off>
to disable public chat. This feature was ported from Kacky servers. - Added new admin command
//chat login <on/off>
to disable player chat. This feature was ported from Kacky servers.
Notes
The new tmnf/forcemods
plugin adds several new config parameters. See .env.example
for reference.
The plugin will be made compatible with Maniaplanet in the future.
MINIcontrol 0.4.0
Breaking changes:
- Switched runtime from Bun to Node.js & tsx
- Switched ORM from drizzle to sequelize
- database support added for mysql, postgres with sqlite still supported
- new environmental variable: DATABASE is introduced, check .env.example for how to setup
- also there is few schema changes for database, recommended to start a new database or do a manual changes
Note for plugin developers
Your plugins will need to be updated so that all imports use relative paths with this release. We're sorry for the inconvenience.
Other changes and fixes:
New: Added /endwu command for TM2020 servers. Ends the currently running warmup.
New: Added /cancelpack command to interrupt pack downloads from (T)MX.
Improved: Maniaplanet compability
Bugfix: Dedimania works again on TMNF / TMUF
Bugfix: XAseco database migrations should work again with this release
Bugfix: Confirm dialogues now correctly show up only for the person who initiated the action instead of all connected players
Bugfix: Maps that were removed from the server that were still in the jukebox won't result in a crash anymore
Bugfix: Checkpoint counter fixed for multilap maps