- from asyncio import sleep
- from datetime import datetime, timedelta
- from typing import Optional
- from discord import Embed, Member
- from discord.ext.commands import Cog, Greedy
- from discord.ext.commands import command, has_permissions, bot_has_permissions
- from ..db import db
- class Mod(Cog):
- def __init__(self, bot):
- self.bot = bot
- @command(name="kick")
- @bot_has_permissions(kick_members=True)
- @has_permissions(kick_members=True)
- async def kick_members(self, ctx, targets: Greedy[Member], *, reason: Optional[str] = "No reason provided."):
- if not len(targets):
- await ctx.send("One or more required arguments are missing.")
- else:
- for target in targets:
- if not target.guild_permissions.administrator:
- await target.kick(reason=reason)
- embed = Embed(title="Member kicked", colour=0xDD2222, timestamp=datetime.utcnow())
- embed.set_thumbnail(url=target.avatar_url)
- fields = [("Member", target.display_name, True),
- ("Reason", reason, True ),
- ("Actioned by", ctx.author.display_name, False)]
- for name, value, inline in fields:
- embed.add_field(name=name, value=value, inline=inline)
- await ctx.send(embed=embed)
- else:
- await ctx.send(f"{target.display_name} could not be kicked.")
- @command(name="ban")
- @bot_has_permissions(ban_members=True)
- @has_permissions(ban_members=True)
- async def ban_members(self, ctx, targets: Greedy[Member], *, reason: Optional[str] = "No reason provided."):
- if not len(targets):
- await ctx.send("One or more required arguments are missing.")
- else:
- for target in targets:
- if not target.guild_permissions.administrator:
- await target.ban(reason=reason)
- embed = Embed(title="Member banned",
- colour=0xDD2222,
- timestamp=datetime.utcnow())
- embed.set_thumbnail(url=target.avatar_url)
- fields = [("Member", target.display_name, True),
- ("Reason", reason, True ),
- ("Actioned by", ctx.author.display_name, False)]
- for name, value, inline in fields:
- embed.add_field(name=name, value=value, inline=inline)
- await ctx.send(embed=embed)
- else:
- await ctx.send(f"{target.display_name} is an admin, I cannot ban him.")
- @command(name="clear", aliases=["purge"])
- @bot_has_permissions(manage_messages=True)
- @has_permissions(manage_messages=True)
- async def clear_messages(self, ctx, limit: Optional[int] = 1):
- limm = 100
- if 0 < limit <= 100:
- with ctx.channel.typing():
- await ctx.message.delete()
- deleted = await ctx.channel.purge(limit=limit)
- await ctx.send(f"Deleted {len(deleted):,} messages.", delete_after=5)
- else:
- await ctx.send(f"I cannot delete more than {limm} messages!")
- @command(name="mute")
- @bot_has_permissions(manage_roles=True)
- @has_permissions(manage_roles=True, manage_guild=True)
- async def mute_members(self, ctx, targets: Greedy[Member], hours: Optional[int], *, reason: Optional[str] = "No reason provided."):
- if not len(targets):
- await ctx.send("One or more required arguments are missing.")
- else:
- unmutes = []
- for target in targets:
- if not self.mute_role in target.roles:
- if ctx.guild.me.top_role.possision > target.top_role.possision:
- role_ids = ", ".join([str(r.id) for r in target.roles])
- end_time = datetime.utcnow() + timedelta(seconds=hours) if hours else None
- db.execute("INSERT INTO mutes VALUES (?, ?, ?", target.id, role_ids, getattr(end_time, "isoformat", lambda: None)())
- await target.edit(roles=[self.mute_role])
- embed = Embed(title="Member muted",
- colour=0xDD2222,
- timestamp=datetime.utcnow())
- embed.set_thumbnail(url=target.avatar_url)
- fields = [("Member", target.display_name, False),
- ("Actioned by", ctx.author.display_name, False ),
- ("Duration", f"{hours:, } hour(s)" if hours else "Indefinte", False),
- ("Reason", reason, False)]
- for name, value, inline in fields:
- embed.add_field(name=name, value=value, inline=inline)
- await ctx.send(embed=embed)
- if hours:
- unmutes.append(target)
- else:
- await ctx.send(f"{target.display_name} could not be muted.")
- else:
- await ctx.send(f"{target.display_name} is already muted.")
- if len(unmutes):
- await sleep(hours)
- await self.unmute(ctx, targets)
- async def unmute(self, ctx, targets, *, reason="Mute time expired"):
- for target in targets:
- if self.mute_role in target.roles:
- role_ids = db.field("SELECT RoleIDs FROM mutes WHERE UserID = ?", target.id)
- roles = [ctx.guild.get_role(int(id_)) for id_ in role_ids.split(", ") if len(id_)]
- db.execute("DELETE FROM mutes WHERE UserID = ?", target.id)
- await target.edit(roles=roles)
- embed = Embed(title="Member unmuted",
- colour=0xDD2222,
- timestamp=datetime.utcnow())
- embed.set_thumbnail(url=target.avatar_url)
- fields = [("Member", target.display_name, False), ("Reason", reason, False)]
- for name, value, inline in fields:
- embed.add_field(name=name, value=value, inline=inline)
- await ctx.send(embed=embed)
- @command(name="unmute")
- @bot_has_permissions(manage_roles=True)
- @has_permissions(manage_roles=True, manage_guild=True)
- async def unmute_members(self, ctx, targets: Greedy[Member], *, reason: Optional[str] = "No reason provided."):
- if not len(targets):
- await ctx.send("One or more required arguments are missing.")
- else:
- await self.unmute(ctx, targets, reason=reason)
- @Cog.listener()
- async def on_ready(self):
- if not self.bot.ready:
- self.mute_role = self.bot.guild.get_role(814576744660205609)
- self.bot.cogs_ready.ready_up("Mod cog ready.")
- def setup(bot):
- bot.add_cog(Mod(bot))
[text] Mod Cog
Viewer
*** This page was generated with the meta tag "noindex, nofollow". This happened because you selected this option before saving or the system detected it as spam. This means that this page will never get into the search engines and the search bot will not crawl it. There is nothing to worry about, you can still share it with anyone.
Editor
You can edit this paste and save as new: