Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import discord
- import json
- import time
- from discord.ext import commands
- from sys import argv
- class ModWarn:
- """
- Warn commands.
- """
- def __init__(self, bot):
- self.bot = bot
- print('Addon "{}" loaded'.format(self.__class__.__name__))
- def validatewarns(self, member):
- with open("data/warnsv2.json", "r") as f:
- warns = json.load(f)
- for idx, warn in enumerate(warns[member.id]["warns"]):
- warntime = time.mktime(time.strptime(warn["timestamp"]))
- deltatime = time.mktime(time.localtime()) - warntime
- if (deltatime / 30) > 1:
- del warns[member.id]["warns"][idx]
- with open("data/warnsv2.json", "w") as f:
- json.dump(warns, f)
- @commands.has_permissions(manage_nicknames=True)
- @commands.command(pass_context=True)
- async def warn(self, ctx, user, *, reason=""):
- """Warn a user."""
- server = ctx.message.server
- issuer = ctx.message.author
- logchannel = discord.utils.get(server.channels, name="logi")
- try:
- member = ctx.message.mentions[0]
- except IndexError:
- await self.bot.say("Proszę oznaczyć użytkownika.")
- return
- self.validatewarns(member)
- with open("data/warnsv2.json", "r") as f:
- warns = json.load(f)
- if member.id not in warns:
- warns[member.id] = {"warns": []}
- warns[member.id]["name"] = member.name + "#" + member.discriminator
- timestamp = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
- warns[member.id]["warns"].append({"issuer_id": issuer.id, "issuer_name": issuer.name, "reason": reason, "timestamp": timestamp})
- with open("data/warnsv2.json", "w") as f:
- json.dump(warns, f)
- msg = "Otrzymałeś ostrzeżenie w {}.".format(server.name)
- if reason != "":
- # much \n
- msg += " Jego powodem jest: " + reason
- msg += "\n\nPrzeczytaj regulamin. To jest twoje {} ostrzeżenie.".format(len(warns[member.id]["warns"]))
- warn_count = len(warns[member.id]["warns"])
- if warn_count == 1:
- msg += " __Człowieku, następne ostrzeżenie wyrzuci Ciebie z serwera.__"
- if warn_count == 2:
- msg += "\n\nCzłowieku, zostałeś wyrzucony, otrzymując następne ostrzeżenie otrzymasz rangę karną - Klasę D."
- if warn_count == 3:
- msg += "\n\nCzłowieku, otrzymałeś 3 ostrzeżenie. Od teraz nie masz możliwości pisania na kanałach tekstowych oraz nie możesz mówić na kanałach głosowych."
- try:
- await self.bot.send_message(member, msg)
- except discord.errors.Forbidden:
- pass # don't fail in case user has DMs disabled for this server, or blocked the bot
- if warn_count == 2:
- await self.bot.kick(member)
- if warn_count == 3:
- role = discord.utils.get(ctx.message.server.roles, name="Klasa D | Wyciszony")
- await self.bot.add_roles(member, role)
- await self.bot.say("Człowieku, {} został ostrzeżony. To jego {} ostrzeżenie.".format(member.mention, len(warns[member.id]["warns"])))
- msg = "⚠️ **Warn**: {} warned {} with his/her warn total now being {} | {}#{}".format(issuer.mention, member.mention, len(warns[member.id]["warns"]), member.name, member.discriminator)
- if reason != "":
- # much \n
- msg += "\n✏️ __Reason__: " + reason
- await self.bot.send_message(logchannel, msg + ("\nCzłowieku, spróbuj następnym razem dodać powód." if reason == "" else ""))
- @commands.has_permissions(manage_nicknames=True)
- @commands.command(pass_context=True)
- async def listwarns(self, ctx, user):
- """List warns for a user. Staff only."""
- server = ctx.message.server
- issuer = ctx.message.author
- logchannel = discord.utils.get(server.channels, name="logi")
- try:
- member = ctx.message.mentions[0]
- except IndexError:
- await self.bot.say("ERROR, użytkownik nie został oznaczony.")
- return
- embed = discord.Embed(color=discord.Color.dark_red())
- embed.set_author(name="Lista ostrzeżeń dla: {}#{}".format(member.display_name, member.discriminator), icon_url=member.avatar_url)
- with open("data/warnsv2.json", "r") as f:
- warns = json.load(f)
- try:
- if len(warns[member.id]["warns"]) == 0:
- embed.description = "Brak!"
- embed.color = discord.Color.green()
- else:
- for idx, warn in enumerate(warns[member.id]["warns"]):
- value = ""
- if ctx.message.channel == self.bot.helpers_channel or ctx.message.channel == self.bot.mods_channel:
- value += "Moderator: " + warn["issuer_name"] + "\n"
- value += "Powód: " + warn["reason"] + " "
- # embed.add_field(name="{}: {}".format(key + 1, warn["timestamp"]), value="Issuer: {}\nReason: {}".format(warn["issuer_name"], warn["reason"]))
- embed.add_field(name="{}: {}".format(idx + 1, warn["timestamp"]), value=value)
- except KeyError: # if the user is not in the file
- embed.description = "Brak!"
- embed.color = discord.Color.green()
- await self.bot.say("", embed=embed)
- @commands.has_permissions(manage_nicknames=True)
- @commands.command(pass_context=True)
- async def listwarnsid(self, ctx, user_id):
- """List warns for a user based on ID. Staff only."""
- server = ctx.message.server
- issuer = ctx.message.author
- logchannel = discord.utils.get(server.channels, name="logi")
- embed = discord.Embed(color=discord.Color.dark_red())
- with open("data/warnsv2.json", "r") as f:
- warns = json.load(f)
- # crappy workaround given how dicts are not ordered
- try:
- embed.set_author(name="Lista ostrzeżeń dla: {}".format(warns[user_id]["name"]))
- if len(warns[user_id]["warns"]) == 0:
- embed.description = "Brak!"
- embed.color = discord.Color.green()
- else:
- for idx, warn in enumerate(warns[user_id]["warns"]):
- value = ""
- if ctx.message.channel == self.bot.helpers_channel or ctx.message.channel == self.bot.mods_channel:
- value += "Moderator: " + warn["issuer_name"] + "\n"
- value += "Powód: " + warn["reason"] + " "
- # embed.add_field(name="{}: {}".format(key + 1, warn["timestamp"]), value="Issuer: {}\nReason: {}".format(warn["issuer_name"], warn["reason"]))
- embed.add_field(name="{}: {}".format(idx + 1, warn["timestamp"]), value=value)
- except KeyError: # if the user is not in the file
- embed.set_author(name="Lista ostrzeżeń dla: {}".format(user_id))
- embed.description = "To ID nie ma ostrzeżeń."
- embed.color = discord.Color.green()
- await self.bot.say("", embed=embed)
- @commands.has_permissions(manage_server=True)
- @commands.command(pass_context=True)
- async def copywarns_id2id(self, ctx, user_id1, user_id2):
- """Copy warns from one user ID to another. Overwrites all warns of the target user ID. Staff only."""
- server = ctx.message.server
- logchannel = discord.utils.get(server.channels, name="logi")
- with open("data/warnsv2.json", "r") as f:
- warns = json.load(f)
- if user_id1 not in warns:
- await self.bot.say("{} nie ma ostrzeżeń.".format(user_id1))
- return
- warn_count = len(warns[user_id1]["warns"])
- if warn_count == 0:
- await self.bot.say("{} nie ma ostrzeżeń!".format(warns[user_id1]["name"]))
- return
- warns1 = warns[user_id1]
- if user_id2 not in warns:
- warns[user_id2] = []
- warns2 = warns[user_id2]
- if "name" not in warns2:
- orig_name = ""
- warns2["name"] = "(skopiowano od {})".format(warns1["name"])
- else:
- orig_name = warns2["name"]
- warns2["name"] = "{} (skopiowano od {})".format(warns2["name"], warns1["name"])
- warns2["warns"] = warns1["warns"]
- with open("data/warnsv2.json", "w") as f:
- json.dump(warns, f)
- await self.bot.say("Człowieku, {} ostrzeżenia zostały skopiowane od {} do {}!".format(warn_count, user_id1, user_id2))
- msg = "📎 **Copied warns**: {} copied {} warns from {} ({}) to ".format(ctx.message.author.mention, warn_count, warns1["name"], user_id1)
- if orig_name:
- msg += "{} ({})".format(warns2["name"], user_id2)
- else:
- msg += user_id2
- await self.bot.send_message(logchannel, msg)
- @commands.has_permissions(manage_nicknames=True)
- @commands.command(pass_context=True)
- async def delwarn(self, ctx, user, idx: int):
- """Remove a specific warn from a user. Staff only."""
- server = ctx.message.server
- logchannel = discord.utils.get(server.channels, name="logi")
- try:
- member = ctx.message.mentions[0]
- except IndexError:
- await self.bot.say("ERROR, użytkownik nie został oznaczony.")
- return
- with open("data/warnsv2.json", "r") as f:
- warns = json.load(f)
- if member.id not in warns:
- await self.bot.say("Człowieku, {} nie ma ostrzeżeń!".format(member.mention))
- return
- warn_count = len(warns[member.id]["warns"])
- if warn_count == 0:
- await self.bot.say("Człowieku, {} nie ma ostrzeżeń!".format(member.mention))
- return
- if idx > warn_count:
- await self.bot.say("Człowieku, index ostrzeżenia jest większy niż ilość ostrzeżeń użytkownika - ({})!".format(warn_count))
- return
- if idx < 1:
- await self.bot.say("MNIEJ NIŻ 1? CHYBA SOBIE ŻARTUJESZ?!")
- return
- warn = warns[member.id]["warns"][idx - 1]
- embed = discord.Embed(color=discord.Color.dark_red(), title="Warn {} on {}".format(idx, warn["timestamp"]),
- description="Issuer: {0[issuer_name]}\nReason: {0[reason]}".format(warn))
- del warns[member.id]["warns"][idx - 1]
- with open("data/warnsv2.json", "w") as f:
- json.dump(warns, f)
- await self.bot.say("Człowieku, zostało usunięte jedno ostrzeżenie dla {}!".format(member.mention))
- msg = "🗑 **Warn removed**: {} deleted a warn issued by {} from {} | {}#{}".format(ctx.message.author.mention, idx, member.mention, member.name, member.discriminator)
- await self.bot.send_message(logchannel, msg, embed=embed)
- @commands.has_permissions(manage_nicknames=True)
- @commands.command(pass_context=True)
- async def delwarnid(self, ctx, user_id, idx: int):
- """Remove a specific warn from a user based on ID. Staff only."""
- server = ctx.message.server
- logchannel = discord.utils.get(server.channels, name="logi")
- with open("data/warnsv2.json", "r") as f:
- warns = json.load(f)
- if user_id not in warns:
- await self.bot.say("Człowieku, {} nie ma ostrzeżeń!".format(user_id))
- return
- warn_count = len(warns[user_id]["warns"])
- if warn_count == 0:
- await self.bot.say("Człowieku, {} nie ma ostrzeżeń!".format(warns[user_id]["name"]))
- return
- if idx > warn_count:
- await self.bot.say("Człowieku, index ostrzeżenia jest większy niż ilość ostrzeżeń użytkownika - ({})!".format(warn_count))
- return
- if idx < 1:
- await self.bot.say("MNIEJ NIŻ 1? CHYBA SOBIE ŻARTUJESZ?!")
- return
- warn = warns[user_id]["warns"][idx - 1]
- embed = discord.Embed(color=discord.Color.dark_red(), title="Warn {} on {}".format(idx, warn["timestamp"]),
- description="Issuer: {0[issuer_name]}\nReason: {0[reason]}".format(warn))
- del warns[user_id]["warns"][idx - 1]
- with open("data/warnsv2.json", "w") as f:
- json.dump(warns, f)
- await self.bot.say("Człowieku, zostało usunięte jedno ostrzeżenie dla {}".format(warns[user_id]["name"]))
- msg = "🗑 **Deleted warn**: {} removed warn {} from {} ({})".format(ctx.message.author.mention, idx, warns[user_id]["name"], user_id)
- await self.bot.send_message(logchannel, msg, embed=embed)
- @commands.has_permissions(manage_nicknames=True)
- @commands.command(pass_context=True)
- async def clearwarns(self, ctx, user):
- """Clear all warns for a user. Staff only."""
- server = ctx.message.server
- logchannel = discord.utils.get(server.channels, name="logi")
- try:
- member = ctx.message.mentions[0]
- except IndexError:
- await self.bot.say("ERROR, użytkownik nie został oznaczony.")
- return
- with open("data/warnsv2.json", "r") as f:
- warns = json.load(f)
- if member.id not in warns:
- await self.bot.say("Człowieku, {} nie ma ostrzeżeń!".format(member.mention))
- return
- warn_count = len(warns[member.id]["warns"])
- if warn_count == 0:
- await self.bot.say("Człowieku, {} nie ma ostrzeżeń!".format(member.mention))
- return
- warns[member.id]["warns"] = []
- with open("data/warnsv2.json", "w") as f:
- json.dump(warns, f)
- await self.bot.say("Człowieku, {} nie ma już żadnych ostrzeżeń!".format(member.mention))
- msg = "🗑 **Cleared warns**: {} cleared {} warns from {} | {}#{}".format(ctx.message.author.mention, warn_count, member.mention, member.name, member.discriminator)
- await self.bot.send_message(logchannel, msg)
- @commands.has_permissions(manage_nicknames=True)
- @commands.command(pass_context=True)
- async def clearwarnsid(self, ctx, user_id):
- """Clear all warns for a user based on ID. Staff only."""
- server = ctx.message.server
- logchannel = discord.utils.get(server.channels, name="logi")
- with open("data/warnsv2.json", "r") as f:
- warns = json.load(f)
- if user_id not in warns:
- await self.bot.say("Człowieku, {} nie ma ostrzeżeń!".format(user_id))
- return
- warn_count = len(warns[user_id]["warns"])
- if warn_count == 0:
- await self.bot.say("Człowieku, {} nie ma ostrzeżeń!".format(warns[user_id]["name"]))
- return
- warns[user_id]["warns"] = []
- with open("data/warnsv2.json", "w") as f:
- json.dump(warns, f)
- await self.bot.say("Człowieku, {} nie ma już żadnych ostrzeżeń!".format(warns[user_id]["name"]))
- msg = "🗑 **Cleared warns**: {} cleared {} warns from {} ({})".format(ctx.message.author.mention, warn_count, warns[user_id]["name"], user_id)
- await self.bot.send_message(logchannel, msg)
- chars = "\\`*_<>#@:~"
- def escape_name(name):
- name = str(name)
- for c in chars:
- if c in name:
- name = name.replace(c, "\\" + c)
- return name.replace("@", "@\u200b") # prevent mentions
- def setup(bot):
- bot.add_cog(ModWarn(bot))
Add Comment
Please, Sign In to add comment