Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 44 additions & 6 deletions redbot/cogs/mutes/mutes.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,20 @@

import discord

from redbot.core import Config, commands, i18n, modlog
from redbot.core.bot import Red
from redbot.core import commands, i18n, modlog, Config
from redbot.core.utils import AsyncIter, bounded_gather, can_user_react_in
from redbot.core.utils.chat_formatting import (
bold,
humanize_timedelta,
humanize_list,
humanize_timedelta,
inline,
pagify,
)
from redbot.core.utils.mod import get_audit_reason
from redbot.core.utils.menus import start_adding_reactions
from redbot.core.utils.views import SimpleMenu
from redbot.core.utils.mod import get_audit_reason
from redbot.core.utils.predicates import MessagePredicate, ReactionPredicate
from redbot.core.utils.views import SimpleMenu

from .converters import MuteTime
from .models import ChannelMuteResponse, MuteResponse
Expand Down Expand Up @@ -765,11 +765,21 @@ async def on_member_join(self, member: discord.Member):
guild = member.guild
if await self.bot.cog_disabled_in_guild(self, guild):
return
await i18n.set_contextual_locales_from_guild(self.bot, guild)
if guild.id not in self._server_mutes or member.id not in self._server_mutes[guild.id]:
if member.is_timed_out():
try:
await member.timeout(
None, reason=_("Cleanup: user was unmuted while not in server")
)
except discord.Forbidden:
pass
except discord.HTTPException:
pass
mute_role = await self.config.guild(guild).mute_role()
if not mute_role:
# timeouts already restore on rejoin
return
await i18n.set_contextual_locales_from_guild(self.bot, guild)
if guild.id in self._server_mutes:
if member.id in self._server_mutes[guild.id]:
role = guild.get_role(mute_role)
Expand Down Expand Up @@ -1461,7 +1471,7 @@ async def channel_mute(
async def unmute(
self,
ctx: commands.Context,
users: commands.Greedy[discord.Member],
users: commands.Greedy[Union[discord.Member, discord.User]],
*,
reason: Optional[str] = None,
):
Expand Down Expand Up @@ -1489,6 +1499,34 @@ async def unmute(
else:
self._channel_mute_events[guild.id] = asyncio.Event()
for user in users:
if not isinstance(user, discord.Member):
removed = False
if guild.id in self._server_mutes and user.id in self._server_mutes[guild.id]:
del self._server_mutes[guild.id][user.id]
removed = True
if removed:
success_list.append(user)
await modlog.create_case(
self.bot,
guild,
ctx.message.created_at,
"sunmute",
user,
author,
reason,
until=None,
)
else:
issue_list.append(
MuteResponse(
success=False,
reason=_(MUTE_UNMUTE_ISSUES["already_unmuted"]).format(
location=_("this server")
),
user=user,
)
)
continue
response = await self.unmute_user(guild, author, user, audit_reason)

if response.success:
Expand Down
Loading