# TrackMania Nations - ASECO/RASP release notes v0.95
Information on the ASECO/RASP system for TrackMania Nations (and Original/Sunrise), a racing game by Nadeo
Author: Frans P. de Vries
Keywords: TrackMania, Nations, Original, Sunrise, racing, games, ASECO, RASP, Jfreu, plugins, records, jukebox

### New features and other changes in the v0.95 release of ASECO/RASP:

- new Dedimania world records support (derived from FAST) with the following features:
  - Dedimania is an online World Records database for all TrackMania games with the official site at http://www.dedimania.com/ and its records database at http://www.dedimania.com/tmstats/?do=stat ; it maintains 30 records for each track in any game (TMO/TMS/TMN/TMU) and any mode (TimeAttack, Rounds, Team, Laps)
  - the Dedimania system consists of two new plugins: plugin.dedimania.php which handles all communication with the central Dedimania server (together with new includes GbxRemote.response.php, xmlrpc_db.inc.php, web_access.inc.php and urlsafebase64.php) and keeps track of new records, and chat.dedimania.php which provides a variety of commands to show records and their relations on the current track
  - the following new commands are available for Dedimania world records, analogous to the existing local records commands:
    - /helpdedi: Displays info about the Dedimania records system (alias: /dedihelp)
    - /dedirecs: Displays all Dedimania records on current track
    - /dedinew: Shows new Dedimania records on current track
    - /dedilive: Shows Dedimania records of online players
    - /dedipb: Shows your Dedimania personal best on current track
    - /dedifirst: Shows first Dedimania record on current track
    - /dedilast: Shows last Dedimania record on current track
    - /dedinext: Shows next better Dedimania record to beat
    - /dedidiff: Shows your difference to first Dedimania record
    - /dedirange: Shows difference first to last Dedimania record
  - new, improved, secured and equalled Dedimania records are shown via chat messages just like local records, as are the record reports before and after each track, with configuration options identical to those for local records
  - the new dedimania.xml configuration file defines various Dedimania parameters and record display settings (akin to config.xml), the server's account (from dedicated.cfg), and all Dedimania messages
  - the Dedimania system communicates with the central Dedimania server over port 8003 by default, so you must open that port on your firewall/router; if that's not possible the system falls back on port 80 (http)
  - the Dedimania system requires plugin.checkpoints.php (the checkpoints tracking plugin) to be included in plugins.xml, before plugin.dedimania.php
  - new `<dedimsg>` and `<dedimsg>` colors are defined in config.xml and used in all relevant Dedimania messages so that they can easily be customized
  - a new onEverySecond event (which, as the name implies, is triggered once every second) is defined in aseco.php to act as a "heart beat" in communicating with the central Dedimania server
  - Laps mode is not supported due to the way checkpoints and laps information is supplied by the TM server
  - LAN logins (with IP and port) are ignored by the Dedimania system
  - mega thanks to Slig for his generous help in building this system J
- the /tmxinfo output now includes the Awards count for a TMX track
- the /tmxinfo and /tmxrecs commands use cached TMX data for the current track to avoid sending multiple requests to the TMX site
- updated the TMXInfoFetcher class to time out when the TMX site is down, and to return several more info fields including the awards count
- updated the TMNDataFetcher class to time out when the master/ladder servers are down
- the minimum number of ranked players that's included in the computation of the /topclans ranking is now configurable via new config.xml setting `<topclans_minplayers>` (default: 2)
- new /admin setgamemode command (parameter: ta, rounds, team, laps, stunts) to change the game mode for the next track into the specified mode
- rewrote /admin prev to consult the server's track list instead of maintaining a track filename variable
- /admin replay will now check whether the currect track is already in the jukebox to get replayed, and if so, not queue it again
- the pop-up window displayed by the /admin mta/wall command now starts with the title and nickname of the admin sending the message
- new /admin shutdown command to shut down the TM server and ASECO/RASP
- it is now possible to have chat-based voting commands temporarily disabled while an admin (of any tier) is online (configured via `$disable_upon_admin` in votes.config.php)
- added /votehelp alias for /helpvote
- the `<limit>` configuration setting in localdatabase.xml restricts the highest records that are shown to all players since v0.85, but now higher records are still shown to the pertaining player only
- updated the GBXDataFetcher class to handle all known Challenge variants, including Forever
- updated RASP's getChallengeData() function to use the GBXDataFetcher class
- added extra check for 'SuperAdmin' login before connecting to the TM server
- added extra check for TM server build '2006-05-30' during start-up
- added a server Name entry to the start-up header in the log
- improved speed of /server and /nextrank commands
- adjusted some timeouts in the GbxRemote module (thanks Slig and Assembler Maniac)
- an alternate (but untested) GbxRemote.bem.php module is included for big-endian machines (thanks again AM)

### Bug fixes in the v0.95 release of ASECO/RASP:

- occasionally an ASECO warning could come up during the jukeboxing & track switching process – fixed by the /admin prev rewrite above
- the /list norecent output includes tracks that are no longer present on the server – fixed
- a harmless "Start index out of bound" warning would be logged when the server has exactly 300 tracks (or a multiple thereof) – fixed
- case-sensitivity in a part of the /add and /admin add code could cause a problem loading a track with a case-insensitive duplicate filename – fixed
- renaming tracks downloaded from TMX into a sanitized filename with a unique sequence number (as introduced in v0.91) could still lead to a problem loading a different track with a duplicate filename into the TM server – fixed, the filename now also includes the TMX ID
- /tmxrecs displays an almost empty pop-up when a track has no TMX records – fixed, an error message is shown instead
- the TMXInfoFetcher class doesn't handle tracks with 26-character UIDs – fixed

### New features and other changes in the v0.93 release of ASECO/RASP:

- new checkpoints tracking support (via plugin.checkpoints.php) with the following features:
  - all checkpoints and finishes are now tracked internally
  - new /cps command to enable/disable displaying the checkpoint passages (since the TM client has it built in for TimeAttack mode, this is only useful in Rounds/Team modes)
  - the first run on a track only stores all checkpoint passages (as long as the finish is reached)
  - if /cps is enabled, subsequent runs will display a small pop-up window at each checkpoint for two seconds (just as long as the TM client displays the checkpoint time), containing the time and the difference to the best run so far
  - if a run has a better finish time, it's stored together with those checkpoints as the new best run
  - the finish is also a checkpoint, but no pop-up is displayed there
  - the checkpoints are only remembered for the duration of each track, not stored in the database
  - a player's display setting is remembered until the next ASECO/RASP restart
- new TMX information support (based on the new TMXInfoFetcher class) with the following features:
  - new /tmxinfo command to display the TMX information on the current track or, when given a track ID (from /list) or a TMX ID, any other track; note that with a TMX ID, the UID field in the output remains empty
  - new /tmxrecs command to display the TMX top-10 world records on the current track or, when given a track ID (from /list) or a TMX ID, any other track
  - optionally show the TMX World Record at the start of a new track (configurable via new config.xml setting `<show_tmxrec>`)
- new /song command (based on the new GBXDataFetcher class) to show the (file)name for the current track's song; no method is currently known to decode the title/artist from the song file
- new /admin prev (alias /admin previous) command to quickly revisit the previous track
- new /list option: /list oldest # displays the # oldest tracks added to the server (default: 10) to complement /list newest
- the /statsall output now includes the Wins/Losses (W/L) ratio
- the rounds reports now also work in Team mode
- finalized the optimization (in v0.92) of the jukeboxing & track switching process
- when a TMX /add or chat-based vote is cancelled by the server during the Tab scoreboard, that reset is also logged
- documented the dependencies of all plugins in their respective headers

### Bug fixes in the v0.93 release of ASECO/RASP:

- when using jfreu.plugin.php (not jfreu.lite.php), if rank limiting is off then newly connected players are not properly entered into the internal players list – fixed
- at ASECO/RASP start-up, authentication errors are ignored (oops) – fixed
- if the same track is /add-ed or /admin add-ed multiple times, multiple files are created in the 'GameData/Tracks/Challenges/TMX/' or 'GameData/Tracks/Challenges/TMXtmp/' directories – fixed, duplicate files for identical tracks are prevented
- if a file already exists in the 'GameData/Tracks/Challenges/TMXtmp/' directory for a /add-ed track and that track is then /add-ed again, the file (with an incremented name) is stored in the 'GameData/Tracks/Challenges/TMX/' directory instead – fixed
- in the TMNDataFetcher, if the serverlogin for an online player starts with a non-alphanumeric character (e.g. '-') then the servernation isn't found – fixed
- if plugin.matchsave.php is not included in plugins.xml (which is the default), /admin match begin crashes the system – fixed, a warning is shown if the plugin is not included
- the administrator check for the chat_tc_listen ability doesn't work – fixed

### New features and other changes in the v0.92b release of ASECO/RASP:

- all temporary bans are now stored in a dynamic bans file, configurable via `$bans_file` in jfreu.config.php (default: plugins/jfreu/jfreu.bans.xml), and automatically restored after an ASECO/RASP restart

### Bug fixes in the v0.92b release of ASECO/RASP:

- sometimes when a player connects, the TeamName is not available to store in the 'players' table, and thus it doesn't show up in the /clans command – fixed this long-standing issue (which had become worse due to the faster GbxRemote module) with a TMNDataFetcher call
- the /jfreu unban command doesn't properly clear the ban – fixed
- there are some minor formatting glitches in the output of /stats, /statsall and /jfreu listbans – fixed

### New features and other changes in the v0.92 release of ASECO/RASP:

- new /statsall command to display any player's world stats (based on an updated TMNDataFetcher class by F*ckfish); you can use a player ID when the player is online on the current server, and otherwise any login (even of players that never visited the current server)
- a new version of GbxRemote.inc.php not only addresses some low-level communication problems on AMD64 systems, but more importantly speeds up communication with the TM server – and therefore the responsiveness of all commands – very significantly (thanks Xerrez & Slig); the effect that the small chat window goes blank for a little while is also reduced
- optimized calculation of all players' server ranks after each track
- more optimization of the jukeboxing & track switching process to (hopefully definitively) prevent stuck tracks
- the /nextrank command now optionally shows the difference in record positions (RP), i.e. the combined number of positions that your records need to be improved in order to catch up with the next better ranked player (configured via `$nextrank_show_rp` in rasp.settings.php)
- by appending an 'h' (case-insensitive) to the time parameter of /jfreu banfor, the specified value is converted from minutes into hours (e.g. /jfreu banfor 4H <login> for a four-hour ban)
- correspondingly, all temporary ban messages now show the remaining time as "X hours XX mins" if it's more than an hour
- new /jfreu unban command to cancel the temporary ban, from the badword filter and /jfreu banfor, of a player (login or ID)
- new /jfreu listbans command to display the list of temporarily banned players; if the remaining time of a ban is more than an hour, it's shown as XhXX
- the /stats output now includes the last online information (like /laston)
- the /laston command can now be used without a parameter (however little use that has)
- added a server Version entry to the start-up header in the log
- the commands list (in HTML and Word) now includes all /admin and /jfreu commands as well

### Bug fixes in the v0.92 release of ASECO/RASP:

- when a player equals his/her record, it's still stored in the 'records' table with the new date/time, in effect changing (increasing) its position if there are other players with the exact same time driven after that record's original date/time (ugly oops) – fixed, equalled records are not stored again; to repair the records that were affected by this bug, you can use this PHP script
- when using jfreu.plugin.php (not jfreu.lite.php), if a player is banned by the badword filter or /jfreu banfor command, then the "left the game" message is still shown – fixed
- also when using jfreu.plugin.php, if a player is kicked once by the ranklimit system, badword filter or /jfreu banfor command, which skip the "left the game" message, then that message would no longer be shown when that player leaves normally again after a subsequent visit – fixed
- Player_IDs are not accepted when the pertaining player is offline, even when that would make sense (e.g. /admin unban <x> after /admin listbans) – fixed
- when two (or more) players have the exact same Avg value, they receive the same server rank – fixed
- when the Avg value shown by /rank, /top10, /top100, etc. rounds to a whole number, the ".0" decimal isn't shown – fixed
- the v0.91 overhaul of the full Jfreu plugin warranted a version update to 0.14 – fixed

### New features and other changes in the v0.91 release of ASECO/RASP:

- enhancements and fixes for the full Jfreu plugin (jfreu.plugin.php & jfreu.chat.php):
  - the jfreu.config.php file was moved from the plugins/ directory to the more appropriate includes/ directory
  - the player join message shows the administrator title (if appropriate) and the server rank when rank limiting is enabled
  - new command /jfreu listlimits to display all rank-limiting related settings in one convenient overview
  - new commands /jfreu writeconfig and /jfreu readconfig to write and read the actual Jfreu config settings to/from a new dynamic config file, configurable via `$conf_file` in jfreu.config.php (default: plugins/jfreu/jfreu.config.xml)
    - the settings managed this way include all the variables in jfreu.config.php, except `$message_start`, all the actual info messages, and `$badwordslist`
    - changing any setting will cause the jfreu.config.xml file to be rewritten with the current values, so that after an ASECO/RASP restart it can be read back to restore those settings (it is however not read automatically)
    - /jfreu readconfig shows the current servername after reading the settings, in case that was changed via the autoranking mechanism
  - new commands /jfreu listvips and /jfreu listvipteams to display the lists of VIPs and VIP_Teams, respectively
  - new command /jfreu readlists to read in the lists of VIPs and VIP_Teams, complementing /jfreu writelists
  - new command /jfreu badwordsnum to set the badwords limit, complementing /jfreu badwords and /jfreu badwordsban
  - new command /jfreu badword to increment the badword count for a player (login or ID) who 'creatively' and intentionally circumvents the badword filter
  - new command /jfreu autochangename to enable or disable automatically changing the servername when the rank limit is updated
  - new command /jfreu infomessages to enable or disable the info messages
  - new `$unspecvote` setting in jfreu.config.php, and new command /jfreu unspecvote to allow or disallow SpecOnly players to use the /unspec command
  - exchanged the functionality of /jfreu setrank and /jfreu setlimit: now setrank enables/disables the rank limit system (just like autorank for the autoranking feature) while setlimit sets the rank limit value itself (similar to hardlimit for the overall hard limit value)
  - corrected /jfreu addteamvip into /jfreu addvipteam, and /jfreu removeteamvip into /jfreu removevipteam (along with all corresponding variables)
  - corrected /jfreu autorankminplayer into /jfreu autorankminplayers, and `$autorankminplayer` into `$autorankminplayers` in jfreu.config.php (proper plural)
  - the /jfreu addvip, /jfreu removevip, /jfreu unspec, /jfreu banfor and /jfreu player commands are now able to use player IDs (in addition to logins)
  - added clearer descriptions to the /jfreu helpall output
  - all relevant /jfreu commands now show the title and nickname of the admin performing those actions
  - added more logging of /jfreu commands usage, and of all the various kick reasons
  - an invalid value specified to /jfreu setlimit, /jfreu hardlimit, /jfreu offset, /jfreu autorankminplayers, /jfreu maxplayers and /jfreu kickworst produces an appropriate error message
  - a login specified to /jfreu unspec that isn't SpecOnly produces an appropriate error message
  - the /jfreu setlimit command without a value now shows the current rank limit
  - the jfreu.unspec.php plugin is integrated into jfreu.plugin.php: spectators that manage to start racing without getting unSpec-ed are kicked after passing a checkpoint; the original kick_player_spec() function is therefore redundant and was disabled
  - the NoVote feature (automatic cancellation of CallVotes) and the /jfreu cancel command are inactive when chat-based votes are enabled
  - fixed and re-enabled the /password command to show the server's player/spectator password to a player or spectator/SpecOnly, respectively
  - fixed /jfreu setlimit on to not change the servername if `$autochangename` is off
  - fixed /jfreu message to use the actual servername instead of the initial one, in case that was changed via the autoranking mechanism
  - fixed SpecOnly player's rank to get checked against the rank limit instead of 0 if `$autorank` is off
  - fixed players with rank 0 (vanilla account) to not get kicked if `$hardlimit` is disabled
  - fixed players with rank 0 (vanilla account) to get considered by the kick_hirank and kick_worst features before other high ranks
  - fixed player with rank higher than `$hardlimit` to still get shown an explanation message before being kicked
  - fixed spectator whose team is in the VIP_Teams list to get marked as VIP instead of SpecOnly
  - fixed inclusion (also in jfreu.lite.php) of wrong jfreu.config.php in case of multiple Aseco installs (for multiple TM servers on the same machine)
  - general code clean-up, including proper use of booleans for all variables that used only 1/0 values, message corrections, redundant code removal, and lots more
- new /laston command to show when a player (login or ID) was last online on the server
- new /admin players command to display the list of all known players, and search for offline players via a (part of a) login or nickname with /admin players <string> (just like /players <string> to search for online players)
- tracks downloaded via /add are now saved to the new 'GameData/Tracks/Challenges/TMXtmp/' directory as they are added only temporarily to the server's track list, while tracks downloaded via /admin add are saved to the 'GameData/Tracks/Challenges/TMX/' directory and added permanently to the server's track list, as before
- the /admin add command now optionally also adds the downloaded track to the jukebox (configured via `$jukebox_adminadd` in rasp.settings.php)
- new /admin addthis command to permanently add the current track to the server's track list if it is playing through a TMX /add vote; this will also move the track file from the 'GameData/Tracks/Challenges/TMXtmp/' directory into the 'GameData/Tracks/Challenges/TMX/' one
- the /add trackref command now creates trackref.txt files in both TMX and TMXtmp directories
- tracklists created by /admin writetracklist now include a <random_map_order> filter section so that /admin readtracklist of such files randomizes the track list again (configurable via new config.xml setting `<writetracklist_random>`)
- /admin black and /admin unblack now automatically perform a writeblacklist, and /admin addguest and /admin removeguest a writeguestlist, so that the blacklist.txt and guestlist.txt files are always in sync in case of a server restart
- on TMO/TMS, /nextmap will also show the environment of the next track
- the chat-based voting configuration options were lifted out of plugin.rasp_votes.php into the new includes/votes.config.php file
- a new TMN & ASECO/RASP quick start guide is included in the DOCS/ directory

### Bug fixes in the v0.91 release of ASECO/RASP:

- a track added to the jukebox via TMX /add vote is temporarily added to the server's track list while playing it, but if multiple tracks are /add-ed right behind eachother, only the last one would be removed from the track list again – fixed, each track is immediately removed from the server's track list after having been loaded successfully for its (single) turn
- /admin setservername uses only the first specified word to set the servername – fixed, all words are now used
- /admin setservername, /admin setmaxplayers and /admin match don't show the nickname of the admin performing those actions – fixed
- /server always shows the initial servername – fixed, it now displays the actual servername, in case that was changed via the autoranking mechanism
- because tracks downloaded from TMX are renamed to filenames derived from the tracks' (sanitized) names, it is possible for tracks with identical names to get mixed up – fixed, the (sanitized) filename is now made unique with a sequence number, if necessary

### New features and other changes in the v0.90 release of ASECO/RASP:

- new and comprehensive player muting support with the following features:
  - player muting (preventing players to chat) automatically becomes available when plugin.muting.php is enabled (uncommented) in plugins.xml
  - muting can be done globally (by admins with sufficient permissions):
    - a player can be added to the global mute list with /admin mute and removed again with /admin unmute
    - admins can view the global mute list with /admin mutelist (alias /admin listmutes)
    - the global mute list is not stored so an ASECO/RASP restart will result in an empty list – consider it an opportunity for redemption of muted players
    - all normal chat by a player on the global mute list is muted for all other players
    - a player on the global mute list is also not allowed to use the /me, /hi, /bye, etc. chat commands (which result in global messages), in order to prevent circumventing the normal chat mute (or possible spamming in retaliation)
    - admins will probably find it more effective and efficient to warn and kick a troublesome player than to mute him/her
    - the admin muting commands are always listed in the help, but disabled if the muting plugin is not included
    - the adminops.xml file has corresponding new entries `<mute>`, `<unmute>`, `<mutelist>` and `<listmutes>`
  - ...or individually by any player:
    - a player can add another player to his/her individual mute list with /mute and remove a player again with /unmute
    - players can view their individual mute list with /mutelist
    - the individual mute list is not stored so leaving the server will result in an empty list upon joining – consider it another opportunity for redemption of muted players
    - all normal chat by a player on another player's mute list is muted only for that other player
    - a muted player's use of the /me, /hi, /bye, etc. chat commands will still be seen by the player who muted him/her
    - players cannot mute admins of any tier (MasterAdmin, Admin & Operator)
  - all muted players' normal chat can still be read in /chatlog, and is logged as usual (if `<log_all_chat>` in config.xml is enabled)
  - directly and completely muting a player is not possible because the TM server first sends out a normal chat line to all other players before ASECO/RASP receives it
  - therefore a mute buffer of the size of the large chat window (18 lines) is maintained for each individual player, containing the global server messages (e.g. records, track changes, votes, etc.) as well as the chat lines from all unmuted players; this buffer also stores any private messages a player sent and received (via /pm, /pma & /admin pm), but not the local messages from most chat commands (e.g. /help, /pb, /wins, /recrange, etc.) nor any error messages
  - whenever a muted player enters a chat line, that line is not appended but instead the individual buffers are sent back as fast as possible to any players that muted him/her, in effect pushing the muted player's line out of the chat window
  - while this is the best possible approach to muting, given the TM server's limitations, it does have a few problems:
    - since local and error messages are not buffered, a muted player entering a chat line will cause those messages to be lost for any players that muted him/her as their buffers are sent back to the chat window; for this reason a global mute may be too confusing and an admin warn/kick more practical
    - because of the delay between the TM server sending chat lines directly to all players and the mute buffers of some (or all) players being sent back to them, a chat line by a muted player is usually visible for a short time; that timing issue is inherent to this approach
    - because of the above timing problem, it's also possible that an unmuted player enters a chat line in between a muted player's line and sending out any mute buffers, which causes that unmuted line to get pushed out of the chat window as well; it is still stored in the mute buffers though, and will be restored to the chat window the next time a muting action occurs
    - to speed up that restore, players who notice they're missing a chat line from an unmuted player can use the new /refresh command to restore their chat window
- new idlekick features in mistral.idlekick.php:
  if spectator kicking is enabled (`$kickSpecToo = true`), a separate idle challenge count is in effect, called `$kickSpecAfter` (default: 4);
  the idle kicking system now takes tiered admins and their player/spectator status into account:
  - MasterAdmins are never idle kicked
  - Admins and Operators are not kicked if they're in player mode and the new `<noidlekick_play>` ability in their respective ability lists (in adminops.xml) is enabled
  - Admins and Operators are not kicked if they're in spectator mode and the new `<noidlekick_spec>` ability in their respective ability lists is enabled
- new /list options:
  /list longest/shortest display the longest and shortest tracks as determined by Author time
  /list newest # displays the # newest tracks added to the server (default: 10)
- in all /list output, recently played tracks (as defined by `$buffersize` in rasp.settings.php) are now shown in light grey to indicate they cannot be jukeboxed yet again
- long lines in the output of /chatlog, /pmlog and /admin pmlog are now cleanly wrapped on words, instead of breaking off in the middle of words
- new /admin wall (alias /admin mta) command to display a message as a pop-up window to all players (familiar from the *nix wall command); the default message color is red but all color and attribute tags can be used, and the adminops.xml file has corresponding new entries `<wall>` and `<mta>`
- the warning message sent via /admin warn can now be customized via a new `<warning>` message in config.xml
- the output of /admin commands that generate a list of players (listbans, listblacks, listguests, listmasters, listadmins, listops) now uses the same blue color for the logins as the /players output
- a new `<karma>` color is defined in config.xml and used in all relevant karma messages so that they can easily be customized
- the aforementioned light grey and blue colors are defined in config.xml too, as `<grey>` and `<login>` respectively; the red color used for nickname headers in all pop-up windows is also configurable, via the new `<nick>` color
- showing the records range before, during (with /liverecs) and after a track if there are no new records, is now optional via new config.xml setting `<show_recs_range>`; if `False`, no range is shown
- the messages for new, improved, secured and equaled records (in localdatabase.xml) have been shortened to reduce wrapping in the small chat window
- if showing the total playtime at the end of each track is enabled, that playtime is also logged
- the MySQL connection can become lost on servers that remain empty for a long time (the default `wait_timeout` is 8 hours), therefore when that happens an automatic MySQL reconnect is now performed (thanks Dagobert)
- renaming the blacklist, guestlist and tracklist extensions into ".xml" in v0.89 was not such a good idea (because the TMN server will create an empty blacklist and guestlist upon starting if it doesn't find the ".txt" versions), so they have been reverted to ".txt"
- added logging of more /admin commands

### Bug fixes in the v0.90 release of ASECO/RASP:

- when using a track ID with /karma, it still reports "Current Track Karma" – fixed, now the pertaining track name is shown
- spectators are never idle-kicked even if `$kickSpecToo` in mistral.idlekick.php is `true` (ugly oops) – fixed
- if a /replay vote passes, another could be started and if it passes too, the same track is queued twice in the jukebox – fixed, /replay is no longer allowed after the track is queued once
- if a track fails to load twice from the jukebox and is dropped, the corresponding chat message is empty – fixed
- /list karma 0 shows the entire track list – fixed, it now shows only tracks with karma less than or equal to 0
- messages sent via /pma show up twice in the sending admin's /pmlog output &ndash fixed
- the `<skipmap>` and `<skip>` abilities are missing from the adminops.xml file – fixed
- in a new installation, the very first line written to logfile.txt is actually lost – fixed

### New features and other changes in the v0.89 release of ASECO/RASP:

- info on actual karma votes: the karma messages can optionally show each player's actual votes, or lack thereof (configured via `$karma_show_votes` in rasp.settings.php)
- requiring finishes before karma voting: a player can optionally be required to finish a track a minimum number of times before being allowed to karma vote for it (configured via `$karma_require_finish` in rasp.settings.php); this is the total number of finishes since the first day a player tried a track, not the number in the current session
- the /karma command now accepts an optional track ID (from your last /list output) to display the karma of that track instead of the current one
- when changing your already existing karma vote, instead of "Vote Successful" the message now is "Vote Changed"
- new /pmlog command to display the most recent 30 (default) lines of your own private messages (both sent and received) in a pop-up window
- /list <xxx> now allows searching for track names/authors with multiple words (previously one word was required, otherwise the entire list was displayed)
- the /admin help command now shows the command list in the chat window, while the new /admin helpall command displays the list with descriptions in a pop-up as before; similarly for /jfreu help and the new /jfreu helpall command – this makes them consistent with the user /help and /helpall commands
- the jfreu.player.php plugin has been renamed to jfreu.lite.php, containing the info messages system and (as before) the player join/leave messages, but nothing else of the full Jfreu plugin functionality
- in the /players output, strip wide font ($w) from nicknames so that the window width isn't stretched out too far by players with long wide nicks and long logins
- wide fonts are also stripped from the sender and receiver nicknames in /pm, /pma and /admin pm
- when showing records before (`<show_recs_before>` is `True`), after (`<show_recs_after>` is `True`) or during (/liverecs) a track and there are no new records, the record range is included instead
- the last page in a multi-page pop-up now uses an 'OK' button (instead of 'Close'), for consistency with all single-page pop-ups
- if an admin (with the chat_jb_recent ability) jukeboxes a recently played track, a warning about the repeat track is shown but it's still jukeboxed again
- the /replay message was changed from "Replay Track upon Completion" into "Replay Track after Finish", which is hopefully easier to understand for non-English speaking players
- all chat-based and TMX /add votes are now cancelled by the server during the Tab scoreboard before the next track is fetched from the jukebox, to prevent interference from a /replay vote passing at the last possible moment
- the default percentage of a track after which a /skip vote is no longer allowed, was reduced from 70% to 50%
- the /admin writetracklist command now accepts an optional filename parameter to write the current match settings to another file than the default
- new /admin readtracklist command for reading the default match settings file, or an alternate one specified with an optional filename parameter, to complement /admin writetracklist; it shows the number of tracks loaded from the file
- the default filename used for the above match settings file is shortened from "rasp-tracklist.txt" to "tracklist.xml", and it's written to and read from the more appropriate "GameData/Tracks/MatchSettings/" directory (previously in "GameData/Tracks/")
- the extension of the blacklist, guestlist and tracklist files (as read and written by the pertaining /admin commands) is updated from ".txt" to the more relevant ".xml"
- the /match load command in plugin.matchsave.php was disabled as it's now redundant with /admin readtracklist
- the /admin acdl command now takes "ON" or "OFF" (case-insensitive) as parameter instead of "Yes"/"No", for consistency with all other boolean (/jfreu) admin commands
- a new `<admin>` color is defined in config.xml and used in all relevant /admin messages so that they can easily be customized
- if you still use the old chat.vote.php plugin, that will now show the current score when a track is loaded
- the `<account>` field in the `<tmserver>` section of config.xml became redundant, and was removed
- an /ad shortcut for /admin and a /jb shortcut for /jukebox become available by uncommenting the appropriate two lines at the start of chat.admin.php and plugin.rasp_jukebox.php, respectively
- aseco.php now determines whether it's running on Win* or *nix operating systems, so it's no longer necessary to define the CRLF constant manually
- lots of code optimization and clean-up, like more efficient handling of TM server calls (thanks Assembler Maniac), better error handling throughout the entire system, and other tid bits

### Bug fixes in the v0.89 release of ASECO/RASP:

- /kick votes are denied when there's no vote in progress, and allowed to start when another vote already is (oops) – fixed
- /admin ban produces an RPC error in the log from the Kick call because the Ban call already kicks the player – fixed by removing the Kick call
- if a track is deleted before pruning its records (/admin prunerecs), those are still counted in players' /summary results (though not /topsums) – fixed
- /pm and /pma send a message even if it's empty – fixed, empty messages are ignored
- in /add and /admin add, after renaming the numeric filename to a (sanitized) track filename, multiple spaces and underscores are not properly reduced to single ones – fixed
- in the original v0.88 zip file (which was fixed one day after release), /jfreu didn't work for any admin tier – fixed

### New features and other changes in the v0.88 release of ASECO/RASP:

- new, flexible and fully integrated tiered administration support with the following features:
  - there are three tiers of administrators: MasterAdmins, Admins and Operators
  - all three tiers of administrators can see who is in each tier with the new /admin listmasters, /admin listadmins and /admin listops commands
  - if a player is in more than one tier, the highest one takes precedence
  - MasterAdmins have no restrictions to their abilities, while the abilities of Admins and Operators can be defined per individual command
  - the list of MasterAdmins is fixed in the `<masteradmins>` section in config.xml; the lists of Admins and Operators, and their respective abilities, are stored in the new adminops.xml file (configurable via new config.xml setting `<adminsops_file>`) and automatically restored after an ASECO/RASP restart
  - MasterAdmins can add and remove Admins dynamically, using the new /admin addadmin and /admin removeadmin commands
  - both MasterAdmins and Admins can add and remove Operators dynamically, using the new /admin addop and /admin removeop commands
  - MasterAdmins can dynamically enable and disable all abilities for Admins and Operators – even their ability to change their own abilities, if you so desire – using the new /admin adminability and /admin opability commands
  - the ability lists also define (non-/admin) chat commands where Admins and Operators have additional capabilities that users don't
  - the /admin help command dynamically lists only the available commands for each tier depending on their allowed abilities
  - the new /admin listabilities command displays which non-/admin abilities (if any) are available to Admins and Operators, with a description; for MasterAdmins, /admin listabilities {admin/op} displays the abilities of the pertaining administrator tier
  - there are no separate commands (e.g. /op), all tiers use the same /admin commands (so there's no code duplication)
  - all /admin chat and log messages show whether a MasterAdmin, Admin or Operator performed the pertaining action
  - the player join message from jfreu.plugin.php (or jfreu.player.php) shows the appropriate administrator title
  - the titles with which MasterAdmins, Admins and Operators are shown in chat and join messages, are configurable via the `<titles>` section in adminops.xml
  - if e.g. Operators do not have the ability to use /pma and /admin pm, they will also not receive such private messages when sent by (Master)Admins
  - any server owner's LAN logins (with IP and port) should be in the `<masteradmins>` section of config.xml and will be skipped by the /admin listmasters command
  - all Jfreu admin commands can be used by MasterAdmins and Admins, but not Operators; also, the /jfreu addadmin command was disabled, and the corresponding `<admin_list>` section from plugins/jfreu/jfreu.vips.xml (previously jfreu.lists.xml) was removed
  - servers that don't need Admins and Operators can simply leave those login lists in adminops.xml empty, and not have the tiered system interfere (phew J)
  - see this table for the default list of abilities
- new karma details: details about the vote counts and percentages can optionally be shown with karma messages (configured via `$karma_show_details` in rasp.settings.php)
- new /admin listdupes command to display a list of duplicate tracks on the server (ready for /admin remove/erase)
- new /admin prunerecs command to delete the records/rs_times database entries for a specific track (by track ID from /list, so you must prune recs for a track before removing/erasing it, otherwise you can't /list it anymore)
- the number of rounds (in Rounds/Team modes) or seconds (in TimeAttack/Laps/Stunts modes) by which a vote expires can now be configured per individual type of TMX /add and chat-based vote (`$r_expire_limit` and `$ta_expire_limit` in plugin.rasp_votes.php)
- the output from /list and /list <xxx> now includes the corresponding ranked records, just like /list norecent
- the /best and /worst commands are now also available via /list best and /list worst
- the /server output now shows the total playing time of all players combined
- the /best, /worst, /summary, /stats, /admin ban and /admin black commands can now also be used on offline logins (only by admins as defined by their abilities)
- moved all jukebox and /add related message strings into rasp.xml for easy customization and localization
- the all-caps UNRANKED text for unranked records in the /pb message is now in narrow font to make it less intrusive
- in Jfreu's player join messages and the /stats output, the ladder ranks are now formatted with spaces between the thousands (like in the Tab scoreboard)
- if Jfreu's info messages are disabled, the "Messages: OFF" reminder isn't shown anymore
- the Jfreu plugin "Loaded" message is no longer shown to a connecting player (only on ASECO/RASP start-up)
- the name of Jfreu's vip/team_vip file is now configurable via `$vips_file` in jfreu.config.php (default: plugins/jfreu/jfreu.vips.xml)
- some code clean-up, like more efficient formatColors and resetRanks functions, a non-looping /nextmap (thanks Assembler Maniac), and other tid bits
- all documentation files included in the .zip are now grouped together in their own DOCS subdirectory

### Bug fixes in the v0.88 release of ASECO/RASP:

- if the jukebox is empty and the current track is deleted (/admin removethis/erasethis), /nextmap hangs up the ASECO/RASP system – fixed by the non-looping rewrite above
- the karma reminders at every finish (`$remind_karma = 2`) could occasionally produce an RPC error in the log – fixed
- there is a typo in plugin.rasp_irc.php causing the IRC connection to fail – fixed
- a couple of /jfreu commands are not shown in the /jfreu help overview – fixed
- /admin removethis/erasethis does not properly log the name of the deleted track – fixed
- the second line of the default Welcome message text was shown without the shadow attribute – fixed

### New features and other changes in the v0.86 release of ASECO/RASP:

- new /list options to complement /list nogold:
  /list noauthor displays all tracks the player finished but didn't beat the Author time on
  /list norecent displays all tracks the player finished but didn't race recently (includes ranked records)
- the output from /list nogold and /list noauthor now shows how much your time is over the track's Gold and Author time, respectively
- new karma vote reminders: if a player (but not a spectator) hasn't karma voted for a track, an optional reminder can be sent upon every finish or at the end of the track (configured via `$remind_karma` in rasp.settings.php)
- new /admin pass command to force any TMX /add and chat-based vote to pass
- the /topclans output now shows how many clan members were counted to compute the clan's average server rank
- the chat-based voting plugin has two new options (`$allow_spec_startvote` and `$allow_spec_voting`) to allow or disallow spectators to start votes and/or to vote /y themselves; this also applies to TMX /add votes, but admins are always allowed to vote /y
- the track history is now written to a file that is automatically restored upon ASECO/RASP start-up; this prevents players from jukeboxing a recently played track after a restart (a frequent event on my server when developing J)
- moved more message strings into config.xml and rasp.xml for easy customization and localization
- some code clean-up, like removing duplicate getPlayerId functions, adding an isSpectator function, and other tid bits

### Bug fixes in the v0.86 release of ASECO/RASP:

- when adding from TMX via /add or /admin add, a track with special characters (besides '?' and '*') in its filename could cause it to not load and get stuck in the jukebox – fixed by changing most special characters into '_' (underscore)
- the special 'trackref' parameter to /add doesn't work – fixed parameter processing and made it an admin-only option; also fixed non-existent 'tracktype' field in the trackref.txt file into 'environment'
- a replayed track is entered multiple times into the track history – fixed
- if a track failed to load from the jukebox, the next track from the server's track list that would get loaded in its place isn't entered into the track history – fixed
- if an admin forces a replay (/admin replay) during a /replay vote, that vote isn't cancelled, potentially allowing a double replay – fixed
- the XML parser changes '+' characters in message strings into spaces – fixed

### New features and other changes in the v0.85 release of ASECO/RASP:

- new /topsums command (short for: top summaries) to display the top-100 of players with the most top-3 ranked records (i.e. of /summary results)
- updated /best and /worst commands to include an track ID column so that tracks can be jukeboxed directly (without going through /list)
- new /admin removethis and /admin erasethis commands to quickly remove the current track from rotation and, if erasethis, also delete the track file
- new up-to-date check at start-up (optional) and /admin uptodate command to check for the current version of ASECO/RASP; consequently, Jfreu's /uptodate command was disabled
- new `<limit>` configuration setting in localdatabase.xml to restrict the highest records that are still displayed
- computation of the required number of votes for TMX /add and chat-based votes adjusted for low player counts
- the informational /helpvote messages sent to all players or just a new player can now be turned off completely
- an extra check for a "stuck" track in the jukebox is done when loading the next one, and if it fails to load twice it's dropped
- if `<show_recs_before>` in config.xml is `true`, the original Current Record message is redundant with the top-8 records list, and no longer shown
- if `<show_recs_before>` in config.xml is `true` and the player has a ranked record, then the Personal Best message can optionally be skipped via `$always_show_pb = false` in rasp.settings.php

### Bug fixes in the v0.85 release of ASECO/RASP:

- in determining the required number of votes, spectators are still included for TMX /add votes – fixed
- when adding from TMX via /add or /admin add, a track with a '?' or '*' in its filename causes it to not load and get stuck in the jukebox – fixed by changing all occurrences of '?' and '*' into '_'
- in very rare conditions (running on WinXP with a buggy PHP time functions library in a country using 8-bit characters) the /server and /stats commands could fail silently because the 'strftime' system call returns a bogus timezone – fixed by changing to 'date' system calls
- using '$g$m' to clear text attributes after track names and player nicknames in various messages could result in inconsistencies with italics – fixed by replacing '$g$m' with '$z$s' (or occasionally '$z$s$i')

### New features and other changes in the v0.84 release of ASECO/RASP:

- new and sophisticated chat-based voting; by including plugin.rasp_votes.php and setting `$feature_votes` in rasp.settings.php to `true`, normal CallVotes are disabled and the following features become available:
  - new /helpvote command to display usage info and the actual voting ratios for the new voting commands
  - new /endround vote to end a round (only enabled in Rounds/Team modes)
  - new /ladder vote to restart the current track immediately when the ladder is down
  - new /replay vote to replay the current track after it's done (prepends it to jukebox)
  - new /skip vote to skip the current track immediately
  - new /kick vote to kick a player
  - new /cancel command for a player to cancel his/her own vote (also works with TMX /add votes; admins can /cancel any vote)
  - extensive configuration options in the new votes.config.php file:
    - separate voting ratios per type of vote, so e.g. a kick vote is harder to pass than an endround vote
    - option to enable /kick vote (default: on) and enable kicking of admins (default: off); if disabled, /kick also isn't listed in the /helpvote output
    - option to perform /ladder restart via quick ChallengeRestart or by prepending track to jukebox and doing NextChallenge
    - option to automatically vote for the vote starter, otherwise the old way remains where the starter also has to vote /y
    - vote expiration options:
      in Rounds/Team modes all votes (except /endround) expire within 3 rounds (default);
      in TimeAttack/Laps/Stunts modes all votes expire after approximately 120 seconds / 2 minutes (default);
      expiration is necessary, otherwise unpassed votes will linger on until the end of the track, preventing players from starting another vote
    - vote reminder options:
      in Rounds/Team modes a reminder can be shown after every round until the vote passes or expires;
      in TimeAttack/Laps/Stunts modes a reminder can be shown approximately every 30 seconds (default) until the vote passes or expires;
      reminders help players not forget about ongoing votes after the last vote message has scrolled out of the chat window
    - optional limits to the number of /ladder, /replay & /skip votes per track (default max: 2); if a limit is 0, that particular vote is disabled
    - optional limits to when /ladder, /replay & /skip votes are allowed in Rounds and TimeAttack mode:
      in Rounds the limit is based on the number of points that the first player already has, compared to the server's points limit;
      in TimeAttack the limit is based on the time the track is already running, compared to the server's time limit;
      /ladder is disabled after 40%, /replay is disabled before 50%, and /skip is disabled after 50% of those limits (all percentages configurable)
    - the rationale behind these optional limits is that it's: annoying to go through the same type of vote more than twice; annoying to go through a ladder restart vote when the track is already a few minutes under way; too early to decide whether to play a track again if when it's not even halfway done; and annoying to go through a skip vote when a track is close to completion
    - there's no limit to the number of endround and kick votes per track, because you may need more than a few of them J
    - there are no /ladder, /replay & /skip limits in Team, Laps & Stunts modes
  - there's no /ban vote command because IMHO only admins should be able to ban
  - in determining the required number of votes, spectators are not included; this now also applies to TMX /add votes
  - if chat-based voting is enabled, the /server output will show a pointer to /helpvote instead of the CallVote timeout and ratio
  - in Rounds/Team modes a running /endround vote is automatically terminated by the EndRound event, i.e. when all players 'Enter' as yet or by an /admin endround/er command
  - the vote expiration and reminder options, and the automatic vote for starter option, also work with TMX /add votes
  - all votes terminate automatically at the start of a new track
  - when a new player connects, an explanatory message that chat-based voting is in effect is shown to that player, or optionally to all players; you can use the latter during an introduction period until most players are familiar with the new voting system
  - integrates properly with TMX /add votes whether or not those are enabled, and whether or not chat-based votes are enabled
  - voting messages use a new pink color (`<vote>` in config.xml) that's sufficiently distinct from the colors of all other message types (but /add related messages retain their normal orange color)
  - for further understanding of the features and configuration options, study the detailed comments in function init_votes() in plugins.rasp_votes.php
- new /admin pmlog command to display the most recent 30 (default) lines of admin pm's in a pop-up window
- updated /admin cancel to cancel TMX & chat votes too
- added more aliases to /admin nextmap command, for consistency with the /skip vote: /admin skipmap and /admin skip
- long lines in the /chatlog pop-up window are now split up with a continuation symbol (...) at the start of the second and following parts
- if `<log_all_chat>` is `true`, non-existent chat commands – lines starting with '/' that cannot be executed – are also logged (but they're not shown in /chatlog)
- (almost) all function calls were updated to remove the deprecated pass-by-reference '&' from parameters
- tweaked various jukebox related messages

### Bug fixes in the v0.84 release of ASECO/RASP:

- in the /chatlog output, strip wide font ($w) from nicknames so that the window width isn't stretched out too far by players with long wide nicks and lengthy chat lines
- with a large number of long chat lines in the /chatlog output, it could hang up the TMN client – fixed
- all player tests w.r.t. jukebox/add actions are done against nickname, potentially causing conflicts between players with identical nicknames – fixed by changing those tests to logins
- if a player voted /y in one TMX /add vote, he/she wasn't be able to vote for another /add vote during the same track – fixed
- if a player tries to /add an existing track, the preceding track in the server's track list is jukeboxed instead of that requested one – fixed
- if a player tries to /add the same track that was just /add-ed (but not yet loaded), another vote is started – fixed
- /add doesn't properly insert the track into the jukebox such that it can be dropped again – fixed
- if /add finds the requested track is already present on the server, the temporary track file wouldn't be deleted – fixed
- using '$z' to clear text attributes after track names and player nicknames in various messages would also turn off the default 'shadowed' style for the remainder of those messages – fixed by replacing '$z' with '$g$m'

### New features and other changes in the v0.82 release of ASECO/RASP:

- new /nextrank command to show the next better ranked player
- new /admin unban and /admin unblack commands to remove players from the ban and black lists; you can use the player IDs from the /admin showbanlist and /admin showblacklist output, respectively, as well as any valid logins
- new /admin addguest and /admin removeguest commands to add players to and remove from the guest list (even offline ones); with addguest you can use player IDs from the /players output, with removeguest from /admin showguestlist, as well as any valid logins
- new /admin cleanbanlist, /admin cleanblacklist and /admin cleanguestlist commands to completely clean the ban, black and guest lists
- added aliases for admin commands: /admin showbanlist or /admin listbans, /admin showblacklist or /admin listblacks, and /admin showguestlist or /admin listguests
- the IP address of a connecting player is now logged along with the rest of the 'join' message
- the updated Matchsave plugin (plugin.matchsave.php, matchsave.xml) by F*ckfish is now part of the standard distribution, although by default not included in plugins.xml
- all function declarations were updated to remove the deprecated pass-by-reference '&' from parameters

### Bug fixes in the v0.82 release of ASECO/RASP:

- if `$prune_records_times` is enabled and there is a syntax error in rasp.xml, there is a possibility for the records/times of all tracks to be deleted – fixed, a syntax error will no longer invoke pruning
- fields 2 & 3 in `<record_first>` in config.xml are out of order – fixed, although it isn't visible anyway as the same (and correct) message from localdatabase.xml supersedes it
- the /admin showbanlist/showblacklist/showguestlist commands are not properly storing the player IDs & logins for later use – fixed
- the "Player dropped...track... from jukebox" message is shown in yellow instead of orange, like all other jukebox messages – fixed

### New features and other changes in the v0.81 release of ASECO/RASP:

- new /chatlog command to display the most recent 30 (default) lines of player chat in a pop-up window
- showing a FAST-like record report after each track is now optional too, via new config.xml setting `<show_recs_after>`; if `False`, the old top-5 from v0.7 is shown
- new /admin showguestlist command to display the list of guest player(s)
- new /admin writeguestlist and /admin readguestlist commands to write/read the player guestlist to/from disk
- the player join/leave messages are now available from a separate jfreu.player.php plugin, in case you don't want/need the rest of the Jfreu functionality (rank limiting, unspec voting, badword filtering, admin commands, etc.)
- the Jfreu unspec-fix plugin (jfreu.unspec.php) by F*ckfish is now part of the standard distribution, although by default not included in plugins.xml

### Bug fixes in the v0.81 release of ASECO/RASP:

- when a player connected, the before record report is shown to all players, instead of just the new one – fixed

### Known problems in the v0.8+ releases of ASECO/RASP:

- If all (non-spectator) players press DEL during the scoreboard at the end of a track, the track switching process is disturbed and the next track in the jukebox will not be loaded. No solution known, this appears to be a TMN server quirk.

## Initial release notes