Changelog for 2023-03-18

Why - Hello there. It's been awhile! How have you been? I've been just swell, thanks for asking. I'm here to release a random update at a random time and act like this was all planned and everything.

Spoiler alert, it's 2 years late 😂

Just a little over 3 years ago, I started working on an update to replace the current the server extension with one that would let me do what I needed in order to add all the cool features that have been suggested over the years. As you could tell, it took some time. In short, I had to teach myself Rust lang and then life happened. What a own journey!

This update being release today is not the update for the long awaited @esm v2.0, unfortunately, but it does lay all the necessary groundwork for me to bring you that update. I don't have a release date, but I can say that it will be released some time this year.

What is coming in the new @esm v2.0 update?

I can't share too many details because I'm always coming up with new ideas and tweaking old ones, but I can tell you that @esm v2.0 will include the following:

  • 32/64 bit support on Windows and Linux Arma 3 servers
  • Improved performance, reliability, and memory-safety, thanks to Rust lang
  • Improved server commands
  • Vehicle and multiple reward support for the reward command
  • And other surprises 😉

If you like reading code, you can see what I'm developing (and what's coming in the new update) by checking out the Github repositories for esm_bot and esm_arma

esm_bot changelog

Core System

  • Upgraded from Ruby 2.7.6 to Ruby 3.2
  • Expanded locale file into multiple files organized by the locales category
  • Renamed ServerSetting attributes to be more descriptive
  • Added server_version attribute to Server
  • Added reward_id, reward_vehicles, cooldown_quantity, and cooldown_type attributes to ServerReward
  • Added global logging methods trace!, debug!, info!, warn!, and error!
  • Added better channel permission checks to handle when the bot is missing send/read permissions
  • Improved await code for message responses with ESM::Bot#wait_for_reply and ESM::Bot#waiting_for_reply?
  • Added ESM::Callbacks class for adding closure based callbacks to classes
  • Added support for loading and executing v1 versions of commands
  • Added support for faster JSON parsing through the ESM::JSON class
  • Expanded ESM::Command::Base methods out into their own files
  • Added programmatic support for commands to skip the cooldown check
  • Replaced ESM::Command::Base#check_failed! with ESM::Command::Base#raise_error!
  • Replaced ESM::Command::Base#deliver! with ESM::Command::Base#send_to_arma
  • Added support for Discord's message reply system. The bot will now reply to the message that triggered it
  • Added support for editing a previously sent message via ESM::Command::Base#edit_message
  • Simplified cooldown updating and creation code to avoid bugs
  • Replaced ESM::Command::Base#discord with ESM::Command::Base#on_execute
  • Replaced ESM::Command::Base#server with ESM::Command::Base#on_response
  • Renamed ESM::Command::Base.type to ESM::Command::Base.set_type
  • Renamed ESM::Command::Base.aliases to ESM::Commmand::Base.register_aliases
  • Replaced ESM::Websocket and its sub-classes with ESM::Connection and its sub-classes.
  • Improved and embed template code
  • Changed the default embed color from "Exile Toast Blue" to randomly pick a color from ESM::Color::Toast
  • Replaced ESM::Event::DiscordLog and ESM::Event::DiscordMessageChannel with ESM::Event::SendToChannel
  • Added @esm v2.0 support to ESM::Event::ServerInitialization and improved its performance
  • Refactored Hash#to_ostruct to allow preserving Ruby data types when casting
  • Refactored OpenStruct#each and OpenStruct#map to prevent nested instances of OpenStruct from being converted to instances of Hash
  • Added ESM::Command.configurations that returns all command permission configurations
  • Added ESM::JSON.pretty_generate for pretty printed JSON
  • Added ESM::Message a Ruby representation of the data structure used for communication with the extension and A3 server
  • Added ESM::Arma::ClassLookup class
    • This singleton class is used to convert Arma 3 object class names to their respective in-game display names
    • Out of the box, this lookup has all vehicles, weapons, attachments, etc., for the base game plus the following mods:
      • CUP
      • Exile (duh 😉)
      • Extended Base Mod
      • Extended Survival Pack
      • KA weapons
      • NiArms weapons
      • RHS
      • Secret Weapons
      • SMA
      • TRYK Uniforms
      • USAF
    • If there are other popular mods that I don't have in this list, please send me Steam Workshop links and I'll get exports for them
  • Added ESM::Arma::HashMap a hash-like class that represents Arma 3's HashMap data type
  • Moved territory ID obfuscation to ESM::Server and based it off of the server's key
  • Added ESM::Server#metadata a volatile key/value data store for storing config data from the server that is only useful while the server is connected to ESM
  • Renamed the following columns on ESM::ServerSetting
    • gambling_payout -> gambling_payout_base
    • logging_reward -> logging_reward_player
    • logging_transfer -> logging_transfer_poptabs
  • Deprecated the following columns on ESM::ServerSetting
    • request_thread_type: No longer needed
    • request_thread_tick: No longer needed
    • logging_path: Moved to config.yml


  • !sqf
    • @esm v2.0: Added the ability to execute code on every connected player by providing everyone or all for a target:
      • !sqf malden everyone systemChat "Hi from ESM!"
  • !server
    • Fixed a bug where the command would not work on a server that was offline

Extension Server

  • Added Rust lang TCP server that handles communicating data between the bot and the Arma servers

esm_arma changelog

This is for the upcoming @esm v2.0. This is not available for public use and does not reflect the current release
Features and code are subject to change

Core System

  • Added tokio based Rust extension that uses message-io, and arma-rs to communicate between the A3 server and the bot (src/esm)
  • Added message standard for communicating data between the bot, the extension, and the Arma server (src/message)
  • Added Rust build tool that handles everything from compiling and building the mod to deploying to the Arma server. Supports both Windows and Linux (src/build)
  • Deprecated extension request system thread for addMissionEventHandler "ExtensionCallback"
  • Added support for reloading esm.key while the server is running
  • Added server side config for lower level control over logging, connection details, etc.
  • Fixed an issue where escape characters in a server name would cause a crash
  • Removed dependency on the server's restart time in exile_server_config to fix an issue when it's commented out
  • Moved account existence checks from SQF to extension for both the player and the target


  • Switched to using stringtable.xml for mod messages to make it easier for the rest of the humans on this planet that don't use English to use their own languages
  • Added support to redirect ESM's SQF logging calls to esm.log instead of the RPT
  • Renamed ESM_DatabaseVersion to ESM_DatabaseExtension
  • Renamed ESM_PayTaxPercentage to ESM_Taxes_TerritoryPayment
  • Renamed ESM_UpgradeTaxPercentage to ESM_Taxes_TerritoryUpgrade
  • Removed ESM_fnc_checkForRequests as that it is no longer needed
  • Switched from Arma 3 CfgFunctions to Exile's preInit style of defining functions
    • Also, I didn't like the look of ESMServer_ so I shortened it to ESMs_
  • Added Discord embed SQF helper functionsESMs_util_embed_create and ESMs_util_embed_addField
  • Replaced ESM_fnc_callExtension with ESMs_system_extension_call
  • Replaced ESM_fnc_exec with ESMs_command_sqf
  • Replaced ESM_fnc_log and ESM_fnc_logToDLL with ESMs_util_log
  • Replaced ESM_fnc_logToDiscord with ESMs_system_discord_log
  • Replaced ESM_fnc_preInit with ESMs_system_process_preInit
  • Replaced ESM_fnc_postServerInitialization with ESMs_system_process_postInit
  • Replaced ESM_fnc_respond with ESMs_system_message_respond_to
  • Replaced ESM_fnc_sendToChannel with ESMs_system_discord_send_to
  • Added SQF Array utility functions ESMs_util_array_all, ESMs_util_array_isValidHashmap, and ESMs_util_array_map
  • Added SQF Hashmap utility functions ESMs_util_hashmap_fromArray, ESMs_util_hashmap_get, and ESMs_util_hashmap_toArray

esm_website changelog

  • Upgraded from Ruby 2.7.6 to Ruby 3.2