discord-bot/CompatBot
2023-11-14 22:26:52 +05:00
..
Commands fix new compiler warning 2023-11-14 22:26:52 +05:00
Database use the latest driver version in case they have the same vulkan/ogl ver 2023-05-01 13:00:06 +05:00
EventHandlers update xfloat mode extractor 2023-09-19 12:41:11 +05:00
Properties suppress compilation warning 2021-08-02 23:28:52 +05:00
ThumbScrapper update code with new language and api features 2023-04-21 02:05:59 +05:00
Utils update macos version mapping 2023-09-20 18:37:22 +05:00
.editorconfig fix compilation warnings after upgrading to dotnet core 3.0 2019-11-01 00:05:54 +05:00
CompatBot.csproj upgrade 3rd-party deps 2023-11-14 22:20:41 +05:00
Config.cs increase default attachment size to 25 MB 2023-04-20 21:16:54 +05:00
Program.cs upgrade d#+ client and update event handlers to keep the ordering where necessary 2023-04-15 19:39:51 +05:00
readme.md More typo fixes 2019-04-10 03:41:41 +05:30
Watchdog.cs use file-scoped namespaces to reduce nesting 2022-06-30 00:59:46 +05:00

RPCS3 Compatibility Bot

Configuration

Currently all configurable tunables are stored in the Config static class that is initialized once on startup. This is mostly done like this because it's very easy to implement and is enough for current needs.

Some settings are grouped in additional static classes for easier use (e.g. Reactions and Colors).

Everything is initialized with default values that correspond to the main bot instance (except for sensitive tokens), and require overriding through configuration for any test instance.

Currently, configuration is possible through the $ dotnet user-secrets command. Configuration through the environment variables was disabled as it had some unintended consequences between bot restarts (preserved values; require complete manual shutdown and restart to update configuration).

Be careful with input validation during configuration, as unhandled exceptions in static constructor will lead to TypeInitializationException and program termination that might be tricky to debug.

In addition to the configuration variables, Config contains the Log instance and the global CancellationTokenSource.

We're using NLog for logging, configured to mimic the default Log4Net layout (mostly because I already have the syntax highlighter for Sublime Text 3 for it). It is also configured to ignore TaskCancelledExceptions that occur when CancellationTokens are being cancelled to reduce spam in logs.

Do log exceptions as an argument to log methods, instead of calling .ToString() on them

Global CancellationTokenSource (Config.Cts) is used to signal the program shutdown.

Do check it and abort whenever possible to reduce the restart time and prevent infinite code execution.

Program entry point

On startup we check for other instances. We wait a bit for their shutdown, or shutdown ourselves otherwise. This is done through spinning a separate thread and using global mutex. Unlike semaphores, mutex must be released in the same thread it was acquired, which is impossible to do in asynchronous code, thus the dedicated thread.

Note that Config initialization will happen on first call to the class.

Next we open the databases and run migrations to upgrade their structure if needed. Currently we have two of them:

  • BotDb is used to store all the settings and custom data for the bot.
  • ThumbsDb is used to store PSN metadata and game thumbnail links.

When databases are ready, we immediately restore bot runtime statistics.

Next we start all the background tasks that will run periodically while the bot is up and running. This includes thumbnail scraping, AppVeyor build history scraper, AMD Driver version updater, etc.

Next we configure the discord client. This includes registering all the commands and event handlers. We use the built-in help formatter and hook up the built-in discord client logging to our own logger.

Of particular note is the GuildAvailable event, where we check and make sure the bot is running in the configured guild. There was one time when bot wasn't configured properly and someone quietly added it to their own private server, which caused crash on startup. That was fun.

We also fun backlog checks where it makes sense for moderation, in case something slipped past while the bot was unavailable.

On restart we try to gracefully wait for a bit to let any outstanding task to complete, but not too long. This is why it is important to check Config.Cts cancellation status whenever possible.