Repository: Cog-Creators/Red-DiscordBot

Issue:
[Mute] Mute/unmute moves users through all channels
### What Red version are you using?

3.4.9

### Cog name

Mutes

### Command name

mute

### What did you expect to happen?

Mute moves user from one channel to another, and then back.

*Or through all channels, and then back.*

### What actually happened?

Mute moved user from one channel to another, moving through all channels in progress.

Final channel was not same as initial channel.

### How can we reproduce this error?

1. Create a server with 3 or more voice channels
2. Make user join one of them
3. Mute that user

### Anything else?

Before mute:
![before mute - voice channels](https://moeka.is-a-good-waifu.com/63CMSKC.png)
After mute:
![after mute - voice channels](https://moeka.is-a-good-waifu.com/5cfKyPk.png)
Audit log:
![audit log - 5 moves for 5 channels](https://moeka.is-a-good-waifu.com/2b2tm6t.png)


Discussion:
To clarify, is this audio muting or text muting? Like did you mute their mic or their ability to type?

This is caused by `[p]mute` when no mute role is set up. The bot is currently calling `channel_mute_user` for every channel in the server, and that function moves the user *to* that channel after applying the overrides if it has permissions to do so.<sup>[1]</sup> This is due to some legacy code from the old mutes cog, as when the bot attempted to mute a user in voice it wouldn't actively mute them until they rejoined the channel, so it moved them in and out of the channel to actually mute the person.<sup>[2]</sup> It seems like somewhere along the way that got changed to moving the user to *every voice channel*. I can confirm that this is still an issue, a `speak` override only update when the user rejoins the voice channel. I would be inclined to believe that simply kicking the user from their current voice channel is the easiest fix to this issue.

[1] https://github.com/Cog-Creators/Red-DiscordBot/blob/008fb0f04219204e79cac981fe278da179f5c5bd/redbot/cogs/mutes/mutes.py#L1816-L1818
[2] <https://discord.com/channels/133049272517001216/718148684629540905/1010645412908113992>
> I would be inclined to believe that simply kicking the user from their current voice channel is the easiest fix to this issue.

While it is an easy way to "fix" this, it's not really a proper fix. We intentionally chose this method over kicking a user when this functionality was implemented, see #4028.

A proper way to fix this would be to verify that the channel we're muting the user in is the channel the user is in and only move them in such a scenario. It shouldn't really be more complicated than the proposed solution and it actually fixes the problem instead of removing functionality.

Resolving patch:
diff --git a/redbot/cogs/mutes/mutes.py b/redbot/cogs/mutes/mutes.py
--- a/redbot/cogs/mutes/mutes.py
+++ b/redbot/cogs/mutes/mutes.py
@@ -1704,7 +1704,7 @@ async def channel_mute_user(
             speak=False,
         )
         send_reason = None
-        if user.voice and user.voice.channel:
+        if user.voice and user.voice.channel == channel:
             if channel.permissions_for(guild.me).move_members:
                 move_channel = True
             else:
@@ -1813,7 +1813,7 @@ async def channel_unmute_user(
                 "speak": None,
             }
 
-        if user.voice and user.voice.channel:
+        if user.voice and user.voice.channel == channel:
             if channel.permissions_for(guild.me).move_members:
                 move_channel = True
 


Test patch: