| Commit message (Collapse) | Author | Age | Lines |
| ... | |
| |/ / / / / / / /
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
Unfortunately, trying to set positions for the help channels during their move from one category to another does not work to well. It introduces a number of glitches and we haven't been able to reliably get a channel to go to a specific position either.
This commit simply removes any attempt to set a position and lets Discord handle it.
|
| |\ \ \ \ \ \ \ \
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
python-discord/mitigate-permission-unsynchronization-available-help-channels
Mitigate available help channels failing to synchronize their permissions
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
The help channels in the `Help: Available` category should automatically synchronize their permissions with the category permissions to ensure that the overwrites we use to prevent people from claiming multiple help channels are properly enforced. Unfortunately, for unknown reasons, they sometimes get in an "out of sync" state that requires intervention to get them back in sync.
This PR mitigates that issue by checking the available channel for their synchronisation status during certain critical times in our help channel system:
1. Whenever the overwrites for the category change
2. Whenever a channel is moved into the new category
3. After the categories have been reset during the initialization process
The check is straightforward: The `ensure_permissions_synchronization` method iterates over all the channels in the category and checks if the channels are currently synchronizing their permissions. If not, we remedy that by making a channel edit request to the Discord API. If all channels were already "in sync", no API calls are made. The latter should make this an inexpensive mitigation procedure: As we typically have very few channels in the available category and channels mostly stay in sync, we typically do very little.
To make this process a bit easier, I've factored out `set_permissions` calls to a helper function that also calls the `ensure_permissions_synchronization` method. The only exception is during the reset process: As we may edit multiple permissions in this loop, it's better to only ensure the synchronization after we're done with all permission changes.
|
| |/ / / / / / / /
| | | | | | | |
| | | | | | | |
| | | | | | | | |
The embed displayed in available help channels still used the term "in use" instead of "occupied". I've updated the embed to reflect the new name of the "occupied" category.
|
| |\ \ \ \ \ \ \ \
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
python-discord/help-channel-system-minor-improvements
Add status emojis to help channels and improve bottom sorting
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
As Discord is having a rather persistent issue with one of the channels in the current `Help: In Use` category, we're going to start using a new category that excludes the old channel.
The old channel, help-argon, appears to be completely broken on Discord's end, resulting in "Not found" errors for any kind of interaction, including channel move and/or channel delete admin actions. As it's still visible, it's currently triggering a lot questions from our members. We hope that using a new category will fix that.
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
The set that keeps track of the used channel names should discard emojis. To do that, I'm cleaning the names before they're added to the set of channel names.
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
The help channel prefix is configurable as a constant, but I accidentally used a static prefix in the utility function that cleaned the channel names. This commit makes sure the utility method uses the prefix defined in the constants.
|
| | | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | |
| | | | | | | | | |
The current approach of trying to find the maximum channel position, adding one, and using that as the position integer for channels does not seem to work reliably. An approach that seems to work in the testing environment is using a very large integer for the position attribute of the channel: It wil be sorted at the bottom and Discord will automatically scale the integer down to `max + 1`.
This also means the `get_position` utility function is no longer needed; it has been removed.
|
| |/ / / / / / / /
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
I've added channel status emojis as a prefix to our help channels to make it more obvious to the end user what the current status of a channel is. All channels in the Available category will be marked with a green checkmark emoji, while all channels in the In Use category will be marked with an hourglass. Channels in the Dormant category stay unadorned.
Channels will be stripped of their previous prefix when moved to another category. This relies on the `help-` naming convention, as that is the most reliable way to do it that does not break if we ever opt for another emoji.
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
The current sorting algorithm we used created unpredictable channel order (for our human end-users) and induced a flickering channel light-show in Discord clients. To combat these undesirable side-effects, I've changed the ordering to always order channels at the bottom of a category. This also means that channels looking for answers the longest will naturally float up.
|
| |\ \ \ \ \ \ \ \
| |/ / / / / / /
|/| | | | | | | |
Implement a new help channel system
|
| | |\ \ \ \ \ \ \
| |/ / / / / / /
|/| | | | | | | |
|
| | | | | | | | | |
|
| | | | | | | | | |
|
| | | | | | | | | |
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
The edit causes two channel update events to dispatch simultaneously:
one for the channel topic changing and one for the category changing.
The ModLog cog currently doesn't support ignoring multiple events of
the same type for the same channel. Therefore, the ignore was hard coded
rather than using the typical ignore mechanism.
This is intended to be a temporary solution; it should be removed once
the ModLog is changed to support this situation.
|
| | | | | | | | | |
|
| | | | | | | | |
| | | | | | | |
| | | | | | | | |
Co-Authored-By: Leon Sandøy <[email protected]>
|
| | | | | | | | | |
|
| | | | | | | | | |
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
There is no longer a reliance on static alphabetical position numbers.
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
When a channel is moved, all channels below have their positions
incremented by 1. This threw off the previous implementation which
relied on position numbers being static.
Co-authored-by: Sebastiaan Zeeff <[email protected]>
|
| | | | | | | | | |
|
| | | | | | | | | |
|
| | | | | | | | | |
|
| | | | | | | | | |
|
| | | | | | | | | |
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
Resetting a specific permission still keeps the overwrite for the member
around despite having default values. These will accumulate over time so
they should be completely removed once the permission needs to be reset.
|
| | | | | | | | | |
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
This was happening when attempting to schedule a task twice for a user.
Because the scheduler refuses to schedule a duplicate, the coroutine
is deallocated right away without being awaited (or closed explicitly
by `scheduled_task`).
To fix, any existing task is cancelled before scheduling. This also
means if somehow a user bypasses the lack of permissions, their
cooldown will be updated. However, it probably doesn't make a difference
as if they can bypass once, they likely can bypass again.
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
Explicitly close the callback if it's a coroutine.
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
Can rely on `__str__` already being a channel's name.
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
Replace retrieval of all channels of a category with a direct comparison
of the categories themselves. In the case of the `on_message` listener,
the change enables the check to be done before the lock acquisition.
This is because it doesn't rely on the channels in the category to be up
to date. In fact, it doesn't even need the category object so it can
exit early without needing to wait for the cog to be ready.
|
| | | | | | | | | |
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
This ensures everyone has a clean slate when the bot restarts or the
cog reloads since the tasks to reinstate permissions would have been
cancelled in those cases.
|
| | | | | | | | | |
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
To support scheduling different coroutines, `_scheduled_task` now
accepts an awaitable in the data arg. The data arg is actually a
named tuple of the wait time and the awaitable.
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
They must be greater than 0 because the cog obviously couldn't do
anything without any channels to work with. It must be greater than
max_available because it'd otherwise be impossible to maintain that many
channels in the Available category.
* Create a new function to validate the value
* Move validation against MAX_CHANNELS_PER_CATEGORY into the function
rather than just logging a warning
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
This will ensure the maximum amount of dormant channels possible before
attempting to move any to the available category. It also allows the
dormant command to already be enabled in case there are still no
dormant channels when trying to init available channels.
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
The ready event wasn't used because channels could change categories
between the time the command is invoked and the cog is ready (e.g. if
move_idle_channel wasn't called yet). his may confused users. So would
potentially long delays for the cog to become ready.
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
* Make a copy of the dict
* Add a `ignore_missing` param to `cancel_task` to suppress the warning
for a task not being found
|
| | | | | | | | | |
|
| | | | | | | | | |
|
| | | | | | | | | |
|
| | | | | | | | | |
|
| | | | | | | | | |
|
| | | | | | | | | |
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
When rescheduling an idle channel, the task will only be cancelled if
the function was told the channel should currently have a task
scheduled. This means warnings for missing tasks will appear when they
should.
The previous approach of checking if a task exists was flawed because
it had no way to tell whether a task *should* exist. It assumed nothing
is wrong if a task doesn't exist.
Currently, the only case when a task shouldn't exist is when the
cog is initialised and channels from the bot's previous life are being
scheduled.
|
| | | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | | |
The dictionary which was iterated to cancel tasks is now "private".
Therefore, the scheduler should provide a public API for cancelling
tasks.
* Delete the task before cancelling it to prevent the done callback,
however unlikely it may be, from deleting the task first
|