performance improvements, stability, and primarily settings-handling improvements. - Due to the container transition, some settings handling became quietly broken or defunct.
64 lines
2.1 KiB
Python
64 lines
2.1 KiB
Python
# mod_perms.py
|
||
import re
|
||
import discord
|
||
from discord.ext import commands
|
||
from modules.common.settings import cfg # ENV-first config helper
|
||
|
||
def _parse_ids(raw: str):
|
||
ids = []
|
||
if not raw:
|
||
return ids
|
||
for tok in re.split(r'[,\s]+', raw.strip()):
|
||
if not tok:
|
||
continue
|
||
try:
|
||
ids.append(int(tok))
|
||
except Exception:
|
||
pass
|
||
return ids
|
||
|
||
def get_mod_role_ids(bot: commands.Bot):
|
||
# Read from ENV/INI via helper; allow comma-separated lists in any field
|
||
reader = cfg(bot)
|
||
keys = ["admin_role_id", "field_mod_role_id", "intel_mod_role_id", "moderator_role_id"]
|
||
collected = []
|
||
for k in keys:
|
||
collected.extend(_parse_ids(reader.get(k, "")))
|
||
# dedupe while preserving order
|
||
seen = set()
|
||
unique = []
|
||
for i in collected:
|
||
if i not in seen:
|
||
seen.add(i)
|
||
unique.append(i)
|
||
return unique
|
||
|
||
def is_moderator_member(member: discord.Member, bot: commands.Bot) -> bool:
|
||
if not isinstance(member, discord.Member):
|
||
return False
|
||
if member.guild_permissions.administrator:
|
||
return True
|
||
mod_ids = set(get_mod_role_ids(bot))
|
||
return any(r.id in mod_ids for r in member.roles)
|
||
|
||
def is_moderator_userid(guild: discord.Guild, user_id: int, bot: commands.Bot) -> bool:
|
||
m = guild.get_member(user_id)
|
||
return is_moderator_member(m, bot) if m else False
|
||
|
||
async def require_mod_ctx(ctx: commands.Context, msg="You don’t have permission to use this."):
|
||
if not is_moderator_member(ctx.author, ctx.bot):
|
||
await ctx.reply(msg)
|
||
return False
|
||
return True
|
||
|
||
async def require_mod_interaction(interaction: discord.Interaction, msg="This command is restricted to moderators."):
|
||
user = interaction.user
|
||
if isinstance(user, discord.Member) and is_moderator_member(user, interaction.client):
|
||
return True
|
||
# Only send a response if we haven’t already
|
||
if not interaction.response.is_done():
|
||
await interaction.response.send_message(msg, ephemeral=True)
|
||
else:
|
||
await interaction.followup.send(msg, ephemeral=True)
|
||
return False
|