73 lines
2.8 KiB
Python
73 lines
2.8 KiB
Python
import discord
|
|
import re
|
|
|
|
def strip_emoji(text):
|
|
"""Remove emoji characters from channel/role names for fuzzy matching."""
|
|
emoji_pattern = re.compile("["
|
|
u"\U0001F600-\U0001F64F" # emoticons
|
|
u"\U0001F300-\U0001F5FF" # symbols & pictographs
|
|
u"\U0001F680-\U0001F6FF" # transport & map symbols
|
|
u"\U0001F1E0-\U0001F1FF" # flags (iOS)
|
|
u"\U00002702-\U000027B0" # dingbats
|
|
u"\U000024C2-\U0001F251" # misc
|
|
u"\U0000FE00-\U0000FE0F" # variation selectors
|
|
u"\U0000200D" # zero width joiner
|
|
u"\U0000E0100-\U0000E01EFF" # variation selectors supplement
|
|
u"\u20E3" # combining enclosing keycap
|
|
u"\u00A9\u00AE\u2122" # copyright, registered, trademark
|
|
"]+", flags=re.UNICODE)
|
|
return emoji_pattern.sub('', text).strip()
|
|
|
|
async def find_channel(guild, channel_name_or_id):
|
|
"""Find a channel by ID first, then by name (exact, then flexible)."""
|
|
# 1. Try by ID
|
|
try:
|
|
ch_id = int(channel_name_or_id)
|
|
channel = guild.get_channel(ch_id)
|
|
if channel:
|
|
return channel
|
|
except (ValueError, TypeError):
|
|
pass
|
|
|
|
# 2. Try exact name match (case-insensitive)
|
|
for ch in guild.channels:
|
|
if ch.name.casefold() == channel_name_or_id.casefold():
|
|
return ch
|
|
|
|
# 3. Try fuzzy match (strip emojis from both sides)
|
|
clean_search = strip_emoji(channel_name_or_id).lower().strip()
|
|
for ch in guild.channels:
|
|
clean_name = strip_emoji(ch.name).lower().strip()
|
|
if clean_name == clean_search:
|
|
return ch
|
|
# 4. If the search name is contained in the channel name
|
|
if clean_search and clean_search in clean_name:
|
|
return ch
|
|
# 5. Or the channel name is contained in the search
|
|
if clean_search and clean_name in clean_search:
|
|
return ch
|
|
|
|
return None
|
|
|
|
async def execute(bot, params, message):
|
|
channels = params.get('channels', [])
|
|
if not channels:
|
|
channels = [params]
|
|
guild = message.guild
|
|
deleted_count = 0
|
|
for channel_params in channels:
|
|
# Support both channel_id and channel_name
|
|
channel_name = channel_params.get('channel_name') or channel_params.get('channel_id')
|
|
if not channel_name:
|
|
continue # skip if no name or id
|
|
channel = await find_channel(guild, channel_name)
|
|
if not channel:
|
|
await message.channel.send(f"Salon '{channel_name}' introuvable.")
|
|
continue
|
|
try:
|
|
await channel.delete(reason="Supprimé par le Superviseur")
|
|
deleted_count += 1
|
|
except discord.Forbidden:
|
|
await message.channel.send(f"Je n'ai pas les permissions pour supprimer le salon '{channel_name}'.")
|
|
if deleted_count > 0:
|
|
await message.channel.send(f"{deleted_count} salon(s) supprimé(s).")
|