This PR fixes catastrophic guild data loading errors that appear when
there are lingering temporary files. In normal operation, temporary
files are deleted as soon as they are copied to the main file. It is
also expected that temporary files are valid JSON files.
However, due to a yesterday's DoS attack, something™️ happened and a
bunch of empty temporary files got written to disk. When Octobot
recovered from the attack, it was unable to load any guild data because
of the temporary files.
This PR addresses this issue by changing the data loading logic:
1) Check if there's a temporary file. If it exists, try loading it.
2) If it is successfully loaded, move the temp file to the main file and
resume operation as normal
3) If it could not be loaded, try loading the main file
4) If it is successfully loaded, delete the temporary file and resume
operation as normal
5) If it is not, throw an error (like before)
This PR was tested on production data and managed to load every guild
without errors.
Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>
Changes in the list:
1. Fly Octo Fly ~ Ebb & Flow (Octo) / Off the Hook → Spectrum Obligato ~
Ebb & Flow (Out of Order) / Off the Hook feat. Dedf1sh
2. `#47` onward / Dedf1sh feat. Off the Hook
3. EchΘ Θnslaught / Free Association
4. Short Order / Off the Hook
5. Fins in the Air / Deep Cut
Signed-off-by: Macintxsh <95250141+mctaylors@users.noreply.github.com>
This PR makes sure that a cancellation token is never *required* to use
an `async` method. This does not affect user experience in any way, only
code quality.
---------
Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>
Closes #311
This change fixes unexpected behavior when a member's Discord roles get
desynchronized with their MemberData roles (e.g. when a member gets
role-muted). In addition this results in less API requests being made
when there are cache misses (commands should execute faster)
---------
Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>
1. The root namespace was changed from `Octobot` to
`TeamOctolings.Octobot`:
> DO prefix namespace names with a company name to prevent namespaces
from different companies from having the same name.
2. `Octobot.cs` was renamed to `Program.cs`:
> DO NOT use the same name for a namespace and a type in that namespace.
3. `IOption`, `Option` were renamed to `IGuildOption` and `GuildOption`
respectively:
> DO NOT introduce generic type names such as Element, Node, Log, and
Message.
4. `Utility` was moved out of the `Services` namespace. It didn't belong
there anyway
5. `Program` static fields were moved to `Utility`
6. Localisation files were moved back to the project source files. Looks
like this fixed `Message.Designer.cs` code generation
---------
Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>