[text] Mod Cog

Viewer

  1. from asyncio import sleep
  2. from datetime import datetime, timedelta
  3. from typing import Optional
  4. from discord import Embed, Member
  5. from discord.ext.commands import Cog, Greedy
  6. from discord.ext.commands import command, has_permissions, bot_has_permissions
  7.  
  8. from ..db import db
  9.  
  10. class Mod(Cog):
  11.         def __init__(self, bot):
  12.                 self.bot = bot
  13.  
  14.         @command(name="kick")
  15.         @bot_has_permissions(kick_members=True)
  16.         @has_permissions(kick_members=True)
  17.         async def kick_members(self, ctx, targets: Greedy[Member], *, reason: Optional[str] = "No reason provided."):
  18.                 if not len(targets):
  19.                         await ctx.send("One or more required arguments are missing.")
  20.                 else:
  21.                         for target in targets:
  22.                                 if not target.guild_permissions.administrator:
  23.                                         await target.kick(reason=reason)
  24.                                         embed = Embed(title="Member kicked", colour=0xDD2222, timestamp=datetime.utcnow())
  25.                                         embed.set_thumbnail(url=target.avatar_url)
  26.  
  27.                                         fields = [("Member", target.display_name, True),
  28.                                         ("Reason", reason, True ),
  29.                                         ("Actioned by", ctx.author.display_name, False)]
  30.  
  31.                                         for name, value, inline in fields:
  32.                                                 embed.add_field(name=name, value=value, inline=inline)
  33.  
  34.                                         await ctx.send(embed=embed)
  35.                                 else:
  36.                                         await ctx.send(f"{target.display_name} could not be kicked.")
  37.  
  38.  
  39.         @command(name="ban")
  40.         @bot_has_permissions(ban_members=True)
  41.         @has_permissions(ban_members=True)
  42.         async def ban_members(self, ctx, targets: Greedy[Member], *, reason: Optional[str] = "No reason provided."):
  43.                 if not len(targets):
  44.                         await ctx.send("One or more required arguments are missing.")
  45.                 else:
  46.                         for target in targets:
  47.                                 if not target.guild_permissions.administrator:
  48.                                         await target.ban(reason=reason)
  49.                                         embed = Embed(title="Member banned",
  50.                                                                                                 colour=0xDD2222,
  51.                                                                                                 timestamp=datetime.utcnow())
  52.                                         embed.set_thumbnail(url=target.avatar_url)
  53.  
  54.                                         fields = [("Member", target.display_name, True),
  55.                                                                                 ("Reason", reason, True ),
  56.                                                                                 ("Actioned by", ctx.author.display_name, False)]
  57.  
  58.                                         for name, value, inline in fields:
  59.                                                 embed.add_field(name=name, value=value, inline=inline)
  60.  
  61.                                         await ctx.send(embed=embed)
  62.                                 else:
  63.                                         await ctx.send(f"{target.display_name} is an admin, I cannot ban him.")
  64.  
  65.         @command(name="clear", aliases=["purge"])
  66.         @bot_has_permissions(manage_messages=True)
  67.         @has_permissions(manage_messages=True)
  68.         async def clear_messages(self, ctx, limit: Optional[int] = 1):
  69.                 limm = 100
  70.                 if 0 < limit <= 100:
  71.                         with ctx.channel.typing():
  72.                                 await ctx.message.delete()
  73.                                 deleted = await ctx.channel.purge(limit=limit)
  74.  
  75.                                 await ctx.send(f"Deleted {len(deleted):,} messages.", delete_after=5)
  76.                 else:
  77.                         await ctx.send(f"I cannot delete more than {limm} messages!")
  78.  
  79.         @command(name="mute")
  80.         @bot_has_permissions(manage_roles=True)
  81.         @has_permissions(manage_roles=True, manage_guild=True)
  82.         async def mute_members(self, ctx, targets: Greedy[Member], hours: Optional[int], *, reason: Optional[str] = "No reason provided."):
  83.                 if not len(targets):
  84.                         await ctx.send("One or more required arguments are missing.")
  85.  
  86.                 else:
  87.                         unmutes = []
  88.                         for target in targets:
  89.                                 if not self.mute_role in target.roles:
  90.                                         if ctx.guild.me.top_role.possision > target.top_role.possision:
  91.                                                 role_ids = ", ".join([str(r.id) for r in target.roles])
  92.                                                 end_time = datetime.utcnow() + timedelta(seconds=hours) if hours else None
  93.  
  94.                                                 db.execute("INSERT INTO mutes VALUES (?, ?, ?", target.id, role_ids, getattr(end_time, "isoformat", lambda: None)())
  95.  
  96.                                                 await target.edit(roles=[self.mute_role])
  97.  
  98.                                                 embed = Embed(title="Member muted",
  99.                                                                                         colour=0xDD2222,
  100.                                                                                         timestamp=datetime.utcnow())
  101.  
  102.                                                 embed.set_thumbnail(url=target.avatar_url)
  103.  
  104.                                                 fields = [("Member", target.display_name, False),
  105.                                                                                         ("Actioned by", ctx.author.display_name, False ),
  106.                                                                                         ("Duration", f"{hours:, } hour(s)" if hours else "Indefinte", False),
  107.                                                                                         ("Reason", reason, False)]
  108.  
  109.                                                 for name, value, inline in fields:
  110.                                                         embed.add_field(name=name, value=value, inline=inline)
  111.                                                 await ctx.send(embed=embed)
  112.  
  113.                                                 if hours:
  114.                                                         unmutes.append(target)
  115.                                         else:
  116.                                                 await ctx.send(f"{target.display_name} could not be muted.")
  117.                                 else:
  118.                                         await ctx.send(f"{target.display_name} is already muted.")
  119.                        
  120.                         if len(unmutes):
  121.                                 await sleep(hours)
  122.                                 await self.unmute(ctx, targets)
  123.  
  124.         async def unmute(self, ctx, targets, *, reason="Mute time expired"):
  125.                 for target in targets:
  126.                         if self.mute_role in target.roles:
  127.                                 role_ids = db.field("SELECT RoleIDs FROM mutes WHERE UserID = ?", target.id)
  128.                                 roles = [ctx.guild.get_role(int(id_)) for id_ in role_ids.split(", ") if len(id_)]
  129.  
  130.                                 db.execute("DELETE FROM mutes WHERE UserID = ?", target.id)
  131.  
  132.                                 await target.edit(roles=roles)
  133.  
  134.                                 embed = Embed(title="Member unmuted",
  135.                                                                         colour=0xDD2222,
  136.                                                                         timestamp=datetime.utcnow())
  137.  
  138.                                 embed.set_thumbnail(url=target.avatar_url)
  139.  
  140.                                 fields = [("Member", target.display_name, False), ("Reason", reason, False)]
  141.  
  142.                                 for name, value, inline in fields:
  143.                                         embed.add_field(name=name, value=value, inline=inline)
  144.                                 await ctx.send(embed=embed)
  145.  
  146.         @command(name="unmute")
  147.         @bot_has_permissions(manage_roles=True)
  148.         @has_permissions(manage_roles=True, manage_guild=True)
  149.         async def unmute_members(self, ctx, targets: Greedy[Member], *, reason: Optional[str] = "No reason provided."):
  150.                 if not len(targets):
  151.                         await ctx.send("One or more required arguments are missing.")
  152.  
  153.                 else:
  154.                         await self.unmute(ctx, targets, reason=reason)
  155.  
  156.         @Cog.listener()
  157.         async def on_ready(self):
  158.                 if not self.bot.ready:
  159.                         self.mute_role = self.bot.guild.get_role(814576744660205609)
  160.                         self.bot.cogs_ready.ready_up("Mod cog ready.")
  161.  
  162.  
  163. def setup(bot):
  164.         bot.add_cog(Mod(bot))

Editor

You can edit this paste and save as new: