Back to Blog

Technical Changelog

For all the nerds who want the juicy details on just about everything that changed.

May 12, 2022

It's been exactly a week (like we said, promise) since our previous post. We threatened we'd do an in-depth post detailing the notable changes with the latest update, and this is that post. We're going to try cover most of the major changes in-depth and list the less major ones at the bottom. Some will slip through the cracks because there are just so many with years of work, but we'll try our best. So, let's get started!

Major Changes

A Complete Rewrite

This update is a complete rewrite of the existing bot. The existing code was ageing, with large chunks of it written while I was still learning. It was difficult to read and even harder to properly maintain. Rewrites are historically a bad idea for just about every project, but in this case it was so bad that it was going to be more fun to throw the baby out with the bath water and start fresh.

The rewrite has a strong focus on maintainability and readability. Standards are enforced and there is thorough testing to make sure the same mistakes aren't repeated. It's also incredibly nice to work with, and means we can start pumping out new features relatively quickly.

Brand and Dashboard Redesign

As is tradition with major versions, we've changed our logo and redesigned the dashboard to be more modern and unique. The new dashboard is sleek and clean, with a strong focus on UX. We've added a command palette for quick navigation that lets you search for options, commands and plugins, and now have a sidebar listing all the plugins on every server page. We improved the status page, refreshed the leaderboard page and added some new features, generally spicing things up with a bit of zing and pep.

We tried to make the home page as eye-catching as possible, without being obnoxious, and, for the most part, it does achieve exactly that (admittedly a little cliché), although the phrase "only up from here" was mostly arbitrarily picked, it does hold some merit. Far from what it could be - the previous features page has been merged with the home page and frequent changes will be made to make it as appealing as possible. Along with visual and functional changes, now when visiting atlas.bot, the dashboard attempts to redirect you to the server you were last viewing. If you still want to access the home page, you can go to it directly at atlas.bot/home.

Slash Commands

Discord is pushing bots to migrate to slash commands and so we built the new version from the ground up with them in mind. There are a lot of rough edges with slash commands, but we think overall once Discord finishes fixing them they will be superior to prefixed commands for most users.

Some of our commands are already using some of the cool new features slash commands bring. /purge uses it to list all the available filtering options, which would otherwise be difficult to remember. /tictactoe lets you challenge someone to a game of tic-tac-toe using button components as the game board.

We have a guide to help users migrate from legacy a! commands here. Servers that were added before the update have a legacy compatibility option enabled which means prefixed commands still function, but it is strongly advised to move to the new system as soon as possible. We don't have a plan set in stone for how we will phase out legacy compatibility, but that will be coming soon.

Music plugin removed

The music plugin has been removed because it was buggy, difficult to maintain and a pretty big legal issue. Other music bots have been shut down, so we've decided we'd rather pull the plug on music and focus on other features like actions and new planned plugins like feeds. We can't recommend other bots for your music needs because most others have pulled the plug the same as us.

Premium to Prime

We decided to rename Atlas Premuim to Atlas Prime. This is our paid subscription service that gives you increased limits and some other cool perks. We're gonna be honest, we did this almost entirely because it sounds cooler. ¯\_(ツ)_/¯

We've also changed how Prime works. Previously, subscribing on Patreon would give every server you own premium perks. This unfortunately is easy to abuse and doesn't work well with future plans we have.

Prime is now setup so you get a fixed set of licenses that you can explicitly use in servers. We haven't worked out the exact details yet, but we'll be covering that more in the future. If you're a patron, check your inbox for a more in-depth post covering the changes.

As a small reminder, Atlas is free to use for the majority of the features. This update has taken actual years and the servers it costs to run aren't exactly cheap. If you have a couple bucks laying around, we'd really appreciate your support on patreon and in return you get some awesome perks. Thanks for all your support! ❤️

Premium instance shut down

The premium instance was created because in a past life Atlas was unstable enough that it was a nice lifeboat for users that needed it. The new version has proven to be significantly more stable out of the gate and so we've decided to send Premium to a nice open farm where it will have lots of room to run around and play with the other bots.

We might consider bringing it back in the future, but for now it's unlikely. Towards the end, Discord incorrectly decided Premium was a spam bot and blocked it from joining new servers and sending direct-messages. It's been months with no reply on the issue, so we're probably not going to bother.

We're also considering white-label instances as a replacement. A higher premium tier where you pay a fixed price per month and you get a hosted version of Atlas just for your server, where you can change the avatar and username and do whatever you want with it. If this ever happens, it would also mean things like action limits that are there to keep users from abusing the bot are no longer necessary on private instances, which could be cool for some servers. No guarantees, but we'll see.

Vanguard

With the rewrite, we set out to make sure we could scale to millions of servers with relatively little work. Existing libraries fell short, so we decided to build our own. Building your own client library is always a difficult task, but for us it was the option that made the most sense.

We set out with a fixed set of goals:

  • Keep it simple and extendable; supporting new Discord features should be quick and maintenance should be simple and straightforward. We're a tiny team, and we want to focus our time on new plugins and other fun things, not adding support for every new feature Discord adds.
  • Cache minimally. Discord doesn't make this easy, but we can skip out on storing a large amount of data and significantly reduce memory usage that we wouldn't be able to disable caching of in other libraries. Atlas doesn't need to know about stickers in every server it's in because Atlas does nothing that uses stickers, so we can save a fair bit of money by not storing them and other data that we don't need.
  • Focus on scaling out of the box. Because we're building this for us, we can do away with things other libraries might add to be more versatile.
  • Use existing and well maintained libraries where possible. Some of the new packages discord.js has put out are really helpful, like discord-api-types which provides type information for the entire library, which greatly reduces developer overhead.

The end result is Vanguard, our Discord API library. It handles connecting to the gateway, REST requests and caching, all in a distributed environment. It also exposes an RPC API and a wrapper for interacting with it so our API can get cached data without having to ask Discord.

It was a tough journey, but the end result has been excellent. There have been some issues popping up which are bound to happen when going from a couple hundred servers during the alpha to a couple hundred thousand overnight, but overall it has been performing excellent.

It's a little cobbled together and not as clean as we would like, but it has been doing well in production and has met our needs just fine. In the future we're hoping we can open source it, but that will take some time. We're also hoping to do more blog posts on Vanguard and other cool things we've been working on.

Better Translations

We know a large portion of our users aren't native English speakers, so we're working on better support for other languages. The previous version had basic translations, but they were usually quite poor in quality and weren't supported everywhere. With the new release, we've built it from the ground up to have better support for translations. We'll be opening up crowd sourced translations in the next month or so.

When translations open up, we'll only be focusing on the most popular languages to start with. Once we're happy with the quality of them, we'll start adding more languages by popularity. If you're interested, you can join our support server where we'll announce when translations open up.

Permanent Staging Instance

Bugs aren't fun. Like Discord, we've setup our own staging environment where you can test the bleeding edge of changes to Atlas and help weed out issues before they hit the main instance. Unlike Discord's staging instance, Atlas Staging is an entirely separate bot with an entirely separate environment - actions, server settings, cases, levels, etc will not carry over to staging.

At the moment we're pushing changes to Atlas faster than they can be tested on staging because we're doing bug fixes in bulk where waiting for people to test them on staging doesn't make sense. In the future we're planning on doing updates to staging a week or so before they hit the main instance to weed out any issues that might remain, which means staging will get major new features before the main instance. We're also considering adding incentives for smaller servers to use staging to help find bugs before they're major issues.

You can invite it here.

Improved Documentation

In the previous version documentation was severely lacking. Originally it was baked into our website and generated from the source code. Then we moved to GitBook where it was partially generated and partially hand written. None of these options worked particularly well - they were always lacking detail, were slow, and were just not helpful to users.

With this release, we're going to be hand writing documentation and making it open source to allow community contributions. We're also going to include guides and in-depth articles on plugins, script functionality and tags.

While it's still a work in progress, you can view the documentation here and submit pull requests for changes here.

Revamped Plugins

Moderation Filters

Atlas moderation has never been something to write home about. With this release, we're trying to change that. The new moderation filters are highly customisable and let you configure your server exactly how you want, with Atlas taking the load off moderators for basic tasks like preventing words from being said and banning repeat offenders.

We've also added cases, which track actions taken by Atlas and your moderators and create a paper trail you can follow to see exactly what actions moderators have taken against a user.

Reaction Roles

Reaction messages are now, by default, managed by the bot and are updated automatically when you make changes to it. This means we can start using components for reaction roles which are overall much more responsive for users. It also means other users can easily edit the reaction message, so there is no longer the issue of having to track down the admin that made the reaction message so they can add a new role to the list. Reaction messages support {tags} so you can also generate an embed in the embed builder and click "Copy as Tag", then paste it in and the bot will create the embed.

There are also now more options for how you get reactions. Emoji reactions are still supported, but component-based options are also included now. You can use a select menu or buttons to give users roles, which are more responsive as it requires the bot to explicitly respond - if there are issues, the user is notified instead of it silently failing.

We also added more per-role options. You can now set whether the role is permanent, whether the role is sticky, and more. You can even include a conditional script that can return an error message or false to prevent the user from getting the role, which is called every time a user tries to get a role.

Levelling Difficulty

Our levelling was a bit steeper than most bots, so we've decided to adjust the difficulty to make it easier to gain levels. Levels are used to reward users for activity and it taking months to achieve a single level at higher levels isn't fun. The new curve is slightly easier and should mean users are levelling up more. This change is retroactive, users who were level 30 before the update are now level 60 for example. Level rewards were also updated to reflect this, if a level reward existed for level 30 it was adjusted to be for level 60, following the previous example. Even though users had their levels changed, they still have the same rewards for their new level as they did for their old one.

Starboard Plugin

The starboard has been split out into it's own plugin and has been given a load of new features that can be used to create customised starboards with advanced filtering.

You can now set the minimum star count, change the emoji, use restrictions to limit who can star what, add minimum and maximum message ages and more. You can also create multiple starboards and have it automatically send the message to the first starboard matching the right criteria. This can be used to, for example, have a standard starboard for the whole server, then have a second starboard that catches messages starred in staff channels and sends them to a private staff starboard. More details are covered in the docs.

Log Plugin

Logging functionality has been split out into a separate plugin just like the starboard. The new plugin provides many more options and allows you to customise logs to your liking. There are no predefined "action" and "mod" logs anymore, you just select the events you want to log and pick a channel to send it to.

Logs are sent to the first log channel that matches the event. If no events are selected for a log channel, all logs are sent to that channel. Log channels with more specificity are prioritised over channels with less specificity.

We've also added improved logging and more event types. We haven't had time yet, but we'll do another pass on the log plugin soon that will add support for logging significantly more internal data like when cases are created and more. We have some really cool ideas to expand the log plugin into something really powerful.

Script Improvements

We completely rewrote the script system to make it more flexible and easier to use. It still feels familiar but has a lot more options and includes things like making use of slash command input, objects and more which are only possible thanks to the rewrite.

You can now create arrays, objects, add comments, create your own tags, import reusable scripts, use named parameters to be more explicit, return early in scripts, loop over array items and more.

We've also added some awesome new tags:

  • {fetch} lets you fetch a HTTP URL and get JSON, XML or text back, opening up many new possibilities.
  • {time} has been added to standardise time parsing and formatting and replaces some other tags like {utils.parseTime}.
  • {settings} has been updated to support the new settings formats.
  • {find} now has a return_all option that lets you return all matches, and {replace} has a replace_all function that does what it says on the tin.
  • {math} supports a new precision_fix option, enabled by default, that helps deal with floating point precision issues.

We've also replaced the script editor on the dashboard. At the moment it's missing a lot of features we'd like it to have, but we have big plans that are only possible with the new editor. The new editor is based on monaco, which you'll be familiar with if you've ever used Visual Studio Code before. It comes by default with a load of nice features that make it wonderful to edit with. We're planning to port over the titanscript features which will add better syntax highlighting, hover hints, auto completion, error checking and more.

Action Updates

Actions are built on top of scripts, so in addition to all the new features we've added to scripts, we've also given actions some of the love. You can now export .actionpack files that contain multiple actions. Importing a .actionpack file will import all the actions in that pack. This is great for sharing actions that are closely related, for example this component callback demo. Keyword actions now support regular expressions. Interval actions now support cron expressions and natural language schedules like every monday at 5pm which makes them a lot more flexible.

We've also added some new trigger types:

  • The Webhook trigger will run the action when a POST request is made to the URL generated when you save the action.
  • The Component Callback trigger will run when a component with the same handler value is clicked.
  • The Guild Boost Add and Guild Boost Remove triggers fire when someone adds or removes a boost from the server. These triggers are experimental and are prone to issues because detecting boost changes is difficult and relies on caching, which we try to do as minimally as possible.
  • Context Menu actions let you create actions that run when you click the appropriate button in the right click menu on users or messages, depending on the context menu type.
  • Voice Channel Join and Voice Channel Leave triggers fire when someone joins or leaves a voice channel.

Less notable changes

An incomplete list of notable changes in no particular order. We've tried not to duplicate things that were listed above, so you should still read the sections above to not miss anything.

  • The dashboard now has some useful shortcuts like Ctrl + S to quickly save changes and Ctrl + K to open the command palette.
  • Restrictions now let you blacklist or whitelist entire categories, rather than just specific channels.
  • Restriction modes can now be toggled per-type (for example, a channel whitelist and a role blacklist).
  • Restrictions now show a specific warning when roles/channels whitelisted to a channel/role have been deleted. We can't just ignore deleted roles/channels as that may unintentionally allow access to commands that were once restricted.
  • Default permissions for commands can now be removed. Be very careful with this, because it will allow users to access commands that they shouldn't be able to access unless you setup other restrictions.
  • The leaderboard can now be reset on the levels dashboard page under advanced settings.
  • The embed builder has been updated and now has more options, an updated preview, persistence and more.
  • Keyword actions now support regex.
  • Commands now have a "Bypass Plugin Restrictions" option that does exactly what you think it does.
  • Commands now have a "Ephemeral" option that sends the output as a message visible only to the message invoker. This is only works through interactions, as set by Discord - at the moment this includes slash commands, buttons and context menus.
  • Options with deleted roles or channels will now render instead of showing as though the input was unset. This fixes issues with some plugins that would attempt to use options even though they showed up as unset.
  • /weather and other commands that resolve locations are much better at picking the right location.
  • There is a new User Info context menu command on users that is essentially the same as /userinfo.
  • /time parses timezones and locations significantly better.
  • /tag now supports personal tags which are stored in the user's profile. You can do /tag create <name> <value> mine:true to create a personal tag, then use it the same as a regular tag. Personal tags take priority over server tags.
  • There is a new Set Reminder context menu command for messages that will extract the time from the target message and schedule a reminder for that time.
  • /redirect is a new command that will follow redirects on a url and return the final url.
  • /pronouns lets you view pronouns for a user and set your own. If the user has no pronouns, we check pronoundb.org for them.
  • /eval now has a "Run Again" button.
  • /convert is better at converting units and has support for more currencies.
  • Tickets now support an archive category where tickets are moved to when they are closed instead of deleting the channel.
  • There is a new Create Ticket context menu message command option that lets you create a ticket from an existing message.
  • /ticket create now lets you open a ticket on behalf of another user if you are an administrator or have the support role.
  • Suggestions now have an approval role that if set is required to approve new suggestions in the verification channel. You can use this to make the verification channel read-only so users can see pending suggestions without being able to approve/deny them.
  • Suggestions now support anonymous suggestions which hides the authors name when the suggestion is created in the suggestions channel.
  • Suggestions now support a template for the approved and denied direct-messages.
  • /purge now has significantly more options that let you filter to just the messages you want.
  • /mute and /unmute now use the native timeouts feature for more reliable mutes.
  • /setup has been added to help new users setup Atlas. It gives some basic info and directs users to the Dashboard.
  • /lock lets you temporarily lock messages in a channel by denying permissions to the @everyone role. Running the command again will unlock the channel and restore the original permissions.
  • You can now change how level roles are synced, whether it's on xp gain or on level up.
  • There is a new User Level context menu command for users that shows the user's level card.
  • /hornypass is a new command that generates a license to be horny. This only works in NSFW channels.
  • /xkcd now supports searching by keyword, for example /xkcd query:standards will return the standards XKCD comic.
  • /tictactoe is a new command that lets you challenge users to a game of tic-tac-toe using components.
  • /dice now supports the full Role20 Dice Specification which includes dice with multiple faces, dice with a modifier, dice with a modifier and a bonus, and dice with a modifier, a bonus, and a penalty. We're honestly not too sure on the exact details but we've been told it's very "poggers".
  • Global commands were added which cannot be disabled. Global commands are used for commands that are important like /setup where disabling them might cause issues.
  • /prime was added to manage prime subscriptions and gift them to servers. This works kinda like boosting a Discord server, you get a fixed set of licenses and you can use them on servers until you run out. Those servers then get Prime benefits until you cancel your subscription or remove the license.
  • Destructive tags like {channel.delete} will require you to go to the server overview page and enable the destructive tags feature.
  • The status page now shows per-shard statuses.
  • Page footers now include the overall system status.
  • Server pages now show a warning if the shard your server has been assigned to is experiencing issues.
  • Channel select options on the dashboard are now sorted the same as they are in Discord.
  • Role select options on the dashboard now show important permissions beside their name to prevent users making very big and bad mistakes.
  • We've sprinkled some tips around the dashboard to explain how some things work. Hover over question mark icons on the dashboard to get a quick explanation of how a feature works.
  • Adding Atlas to a server with our default invite link will now redirect you to a setup screen once you've added the bot, with some setup instructions to help new users get started.
  • We now have a brand new template renderer that is super fast and will help us render images faster. We'll be using this for level cards in the future, at the moment it's only used for the /hornypass command.
  • When signed in, the dashboard will now "hoist" the user to the top of the leaderboard, even if they aren't the top user.
  • Leaderboards now show the total player count.
  • Users that leave the server are now hidden on the leaderboard.