from discord.ext import commands import discord import time from typing import Optional from query.channel import get_interact from query.user import ignore_user, unignore_user, is_ignored from common.logging import report from common.settings import check_ignore class Admin(commands.Cog): def __init__(self, bot): # Special method that is called when the cog is loaded self.bot = bot @commands.slash_command( description="Get the bot's current websocket and API latency.", brief="Test latency", help="Test latency by polling the gateway and API." ) @commands.has_permissions(administrator=True) async def ping(self, ctx: commands.Context): # Halt on ignore list. if await check_ignore(self.bot.pg, ctx.author): return start_time = time.time() await ctx.respond(f"Pong!\nGateway heartbeat in {round(self.bot.latency * 1000)}ms.") end_time = time.time() await ctx.send(f"API roundtrip latency {round((end_time - start_time) * 1000)}ms.") @commands.slash_command( description="Send a message", brief="Chat", help="Make a chat message", aliases= ("say", "pm", "dm", "echo", "print") ) #async def msg(self, ctx: commands.Context, channel: Optional[discord.TextChannel], user: Optional[discord.User], *, message: str = None): async def msg(self, ctx: commands.Context, channel: Optional[discord.TextChannel], user: Optional[discord.User], message: str = None): # Halt on ignore list. if await check_ignore(self.bot.pg, ctx.author): return #print(f"Is Guild Admin: {ctx.author.guild_permissions.administrator}") #print(f"Author has perms in main output channel: {self.bot.get_channel(self.bot.OUTPUT_CHANNEL_ID).permissions_for(ctx.author).send_messages}") #print(f"Has author perms in main output channel: {ctx.author.permissions_in(self.bot.get_channel(self.bot.OUTPUT_CHANNEL_ID)).send_messages}") if not message: if channel: await ctx.respond(f"What would you like me to say in `{channel}`?") elif user: await ctx.respond(f"What would you like me to say to `{user}`?") else: await ctx.respond("What would you like me to say?") elif channel: if await get_interact(self.bot.pg, channel.id) or channel.permissions_for(ctx.author).administrator or self.bot.get_channel(self.bot.OUTPUT_CHANNEL_ID).permissions_for(ctx.author).send_messages: await channel.send(message) await ctx.respond("Message sent.") await report(self.bot, f"`{ctx.author}` @ {channel.mention}: {message}", ctx.guild) else: await ctx.respond(f"Interactive mode for {channel} is deactivated.") elif user and self.bot.get_channel(self.bot.OUTPUT_CHANNEL_ID).permissions_for(ctx.author).send_messages: await user.send(message) await ctx.respond("Message sent.") await report(self.bot, f"`{ctx.author}` @ `{user.name}`: {message}") else: await ctx.respond(message) await report(self.bot, f"`{ctx.author}` has sent {message} locally.", ctx.guild) @commands.slash_command( description="Change status.", brief="Set status", help="Update the bot's status." ) async def status(self, ctx: commands.Context, *, text: str): # Halt on ignore list. if await check_ignore(self.bot.pg, ctx.author): return await self.bot.change_presence(activity=discord.Game(name=text)) await report(self.bot, f"`{ctx.author}` has set my status to `{text}`.") @commands.slash_command( description="Get ignored.", brief="Ignore sender", help="Will have the bot ignore the user from now on." ) async def ignoreme(self, ctx: commands.Context): # Halt on ignore list. if await check_ignore(self.bot.pg, ctx.author): return await ignore_user(self.bot.pg, ctx.author.id) await ctx.respond("To revert this use the `/unignoreme` command.") await report(self.bot, f"`{ctx.author}` has requested to be ignored.") @commands.slash_command( description="No longer get ingored.", brief="Un-ignore sender", help="No longer will the bot ignore the user." ) async def unignoreme(self, ctx: commands.Context): await unignore_user(self.bot.pg, ctx.author.id) await ctx.respond(f"I shall now interact with you again where my channel settings allow it.") await report(self.bot, f"`{ctx.author}` has requested to be un-ignored.") @commands.slash_command( description="Ignore status for user.", brief="Check if user is ingored", help="Verify if the user is being ignored." ) async def isignored(self, ctx: commands.Context, user: Optional[discord.User]): # Halt on ignore list. if await check_ignore(self.bot.pg, ctx.author): return if not user: user = ctx.author if await is_ignored(self.bot.pg, user.id): await ctx.respond(f"I am ingoring `{user}`.") else: await ctx.respond(f"I am not ignoring `{user}`.") def setup(bot): # Called by Pycord to setup the cog bot.add_cog(Admin(bot)) # Add the cog to the bot