shaiwatcher/mod_perms.py
Franz Rolfsvaag 5368d21be4 0.3.9.2.a5
performance improvements, stability, and primarily settings-handling improvements.
  - Due to the container transition, some settings handling became quietly broken or defunct.
2025-08-10 20:23:09 +02:00

64 lines
2.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 dont 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 havent 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