barwa100

modwarn.py

Jun 30th, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 15.36 KB | None | 0 0
  1. import discord
  2. import json
  3. import time
  4. from discord.ext import commands
  5. from sys import argv
  6.  
  7. class ModWarn:
  8.     """
  9.    Warn commands.
  10.    """
  11.     def __init__(self, bot):
  12.         self.bot = bot
  13.         print('Addon "{}" loaded'.format(self.__class__.__name__))
  14.  
  15.     def validatewarns(self, member):
  16.         with open("data/warnsv2.json", "r") as f:
  17.             warns = json.load(f)
  18.         for idx, warn in enumerate(warns[member.id]["warns"]):
  19.             warntime = time.mktime(time.strptime(warn["timestamp"]))
  20.             deltatime = time.mktime(time.localtime()) - warntime
  21.             if (deltatime / 30) > 1:
  22.                 del warns[member.id]["warns"][idx]
  23.         with open("data/warnsv2.json", "w") as f:
  24.             json.dump(warns, f)
  25.  
  26.     @commands.has_permissions(manage_nicknames=True)
  27.     @commands.command(pass_context=True)
  28.     async def warn(self, ctx, user, *, reason=""):
  29.         """Warn a user."""
  30.         server = ctx.message.server
  31.         issuer = ctx.message.author
  32.         logchannel = discord.utils.get(server.channels, name="logi")
  33.         try:
  34.             member = ctx.message.mentions[0]
  35.         except IndexError:
  36.             await self.bot.say("Proszę oznaczyć użytkownika.")
  37.             return
  38.         self.validatewarns(member)
  39.         with open("data/warnsv2.json", "r") as f:
  40.             warns = json.load(f)
  41.         if member.id not in warns:
  42.             warns[member.id] = {"warns": []}
  43.         warns[member.id]["name"] = member.name + "#" + member.discriminator
  44.         timestamp = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
  45.         warns[member.id]["warns"].append({"issuer_id": issuer.id, "issuer_name": issuer.name, "reason": reason, "timestamp": timestamp})
  46.         with open("data/warnsv2.json", "w") as f:
  47.             json.dump(warns, f)
  48.         msg = "Otrzymałeś ostrzeżenie w {}.".format(server.name)
  49.         if reason != "":
  50.             # much \n
  51.             msg += " Jego powodem jest: " + reason
  52.         msg += "\n\nPrzeczytaj regulamin. To jest twoje {} ostrzeżenie.".format(len(warns[member.id]["warns"]))
  53.         warn_count = len(warns[member.id]["warns"])
  54.         if warn_count == 1:
  55.             msg += " __Człowieku, następne ostrzeżenie wyrzuci Ciebie z serwera.__"
  56.         if warn_count == 2:
  57.             msg += "\n\nCzłowieku, zostałeś wyrzucony, otrzymując następne ostrzeżenie otrzymasz rangę karną - Klasę D."
  58.         if warn_count == 3:
  59.             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."
  60.         try:
  61.             await self.bot.send_message(member, msg)
  62.         except discord.errors.Forbidden:
  63.             pass  # don't fail in case user has DMs disabled for this server, or blocked the bot
  64.         if warn_count == 2:
  65.             await self.bot.kick(member)
  66.         if warn_count == 3:
  67.             role = discord.utils.get(ctx.message.server.roles, name="Klasa D | Wyciszony")
  68.             await self.bot.add_roles(member, role)
  69.         await self.bot.say("Człowieku, {} został ostrzeżony. To jego {} ostrzeżenie.".format(member.mention, len(warns[member.id]["warns"])))
  70.         msg = "⚠️ **Warn**: {} warned {} with his/her warn total now being {} | {}#{}".format(issuer.mention, member.mention, len(warns[member.id]["warns"]), member.name, member.discriminator)
  71.         if reason != "":
  72.             # much \n
  73.             msg += "\n✏️ __Reason__: " + reason
  74.         await self.bot.send_message(logchannel, msg + ("\nCzłowieku, spróbuj następnym razem dodać powód." if reason == "" else ""))
  75.  
  76.     @commands.has_permissions(manage_nicknames=True)
  77.     @commands.command(pass_context=True)
  78.     async def listwarns(self, ctx, user):
  79.         """List warns for a user. Staff only."""
  80.         server = ctx.message.server
  81.         issuer = ctx.message.author
  82.         logchannel = discord.utils.get(server.channels, name="logi")
  83.         try:
  84.             member = ctx.message.mentions[0]
  85.         except IndexError:
  86.             await self.bot.say("ERROR, użytkownik nie został oznaczony.")
  87.             return
  88.         embed = discord.Embed(color=discord.Color.dark_red())
  89.         embed.set_author(name="Lista ostrzeżeń dla: {}#{}".format(member.display_name, member.discriminator), icon_url=member.avatar_url)
  90.         with open("data/warnsv2.json", "r") as f:
  91.             warns = json.load(f)
  92.         try:
  93.             if len(warns[member.id]["warns"]) == 0:
  94.                 embed.description = "Brak!"
  95.                 embed.color = discord.Color.green()
  96.             else:
  97.                 for idx, warn in enumerate(warns[member.id]["warns"]):
  98.                     value = ""
  99.                     if ctx.message.channel == self.bot.helpers_channel or ctx.message.channel == self.bot.mods_channel:
  100.                         value += "Moderator: " + warn["issuer_name"] + "\n"
  101.                     value += "Powód: " + warn["reason"] + " "
  102.                     # embed.add_field(name="{}: {}".format(key + 1, warn["timestamp"]), value="Issuer: {}\nReason: {}".format(warn["issuer_name"], warn["reason"]))
  103.                     embed.add_field(name="{}: {}".format(idx + 1, warn["timestamp"]), value=value)
  104.         except KeyError:  # if the user is not in the file
  105.             embed.description = "Brak!"
  106.             embed.color = discord.Color.green()
  107.         await self.bot.say("", embed=embed)
  108.  
  109.     @commands.has_permissions(manage_nicknames=True)
  110.     @commands.command(pass_context=True)
  111.     async def listwarnsid(self, ctx, user_id):
  112.         """List warns for a user based on ID. Staff only."""
  113.         server = ctx.message.server
  114.         issuer = ctx.message.author
  115.         logchannel = discord.utils.get(server.channels, name="logi")
  116.         embed = discord.Embed(color=discord.Color.dark_red())
  117.         with open("data/warnsv2.json", "r") as f:
  118.             warns = json.load(f)
  119.         # crappy workaround given how dicts are not ordered
  120.         try:
  121.             embed.set_author(name="Lista ostrzeżeń dla: {}".format(warns[user_id]["name"]))
  122.             if len(warns[user_id]["warns"]) == 0:
  123.                 embed.description = "Brak!"
  124.                 embed.color = discord.Color.green()
  125.             else:
  126.                 for idx, warn in enumerate(warns[user_id]["warns"]):
  127.                     value = ""
  128.                     if ctx.message.channel == self.bot.helpers_channel or ctx.message.channel == self.bot.mods_channel:
  129.                         value += "Moderator: " + warn["issuer_name"] + "\n"
  130.                     value += "Powód: " + warn["reason"] + " "
  131.                     # embed.add_field(name="{}: {}".format(key + 1, warn["timestamp"]), value="Issuer: {}\nReason: {}".format(warn["issuer_name"], warn["reason"]))
  132.                     embed.add_field(name="{}: {}".format(idx + 1, warn["timestamp"]), value=value)
  133.         except KeyError:  # if the user is not in the file
  134.             embed.set_author(name="Lista ostrzeżeń dla: {}".format(user_id))
  135.             embed.description = "To ID nie ma ostrzeżeń."
  136.             embed.color = discord.Color.green()
  137.         await self.bot.say("", embed=embed)
  138.  
  139.     @commands.has_permissions(manage_server=True)
  140.     @commands.command(pass_context=True)
  141.     async def copywarns_id2id(self, ctx, user_id1, user_id2):
  142.         """Copy warns from one user ID to another. Overwrites all warns of the target user ID. Staff only."""
  143.         server = ctx.message.server
  144.         logchannel = discord.utils.get(server.channels, name="logi")
  145.         with open("data/warnsv2.json", "r") as f:
  146.             warns = json.load(f)
  147.         if user_id1 not in warns:
  148.             await self.bot.say("{} nie ma ostrzeżeń.".format(user_id1))
  149.             return
  150.         warn_count = len(warns[user_id1]["warns"])
  151.         if warn_count == 0:
  152.             await self.bot.say("{} nie ma ostrzeżeń!".format(warns[user_id1]["name"]))
  153.             return
  154.         warns1 = warns[user_id1]
  155.         if user_id2 not in warns:
  156.             warns[user_id2] = []
  157.         warns2 = warns[user_id2]
  158.         if "name" not in warns2:
  159.             orig_name = ""
  160.             warns2["name"] = "(skopiowano od {})".format(warns1["name"])
  161.         else:
  162.             orig_name = warns2["name"]
  163.             warns2["name"] = "{} (skopiowano od {})".format(warns2["name"], warns1["name"])
  164.         warns2["warns"] = warns1["warns"]
  165.         with open("data/warnsv2.json", "w") as f:
  166.             json.dump(warns, f)
  167.         await self.bot.say("Człowieku, {} ostrzeżenia zostały skopiowane od {} do {}!".format(warn_count, user_id1, user_id2))
  168.         msg = "📎 **Copied warns**: {} copied {} warns from {} ({}) to ".format(ctx.message.author.mention, warn_count, warns1["name"], user_id1)
  169.         if orig_name:
  170.             msg += "{} ({})".format(warns2["name"], user_id2)
  171.         else:
  172.             msg += user_id2
  173.         await self.bot.send_message(logchannel, msg)
  174.  
  175.     @commands.has_permissions(manage_nicknames=True)
  176.     @commands.command(pass_context=True)
  177.     async def delwarn(self, ctx, user, idx: int):
  178.         """Remove a specific warn from a user. Staff only."""
  179.         server = ctx.message.server
  180.         logchannel = discord.utils.get(server.channels, name="logi")
  181.         try:
  182.             member = ctx.message.mentions[0]
  183.         except IndexError:
  184.             await self.bot.say("ERROR, użytkownik nie został oznaczony.")
  185.             return
  186.         with open("data/warnsv2.json", "r") as f:
  187.             warns = json.load(f)
  188.         if member.id not in warns:
  189.             await self.bot.say("Człowieku, {} nie ma ostrzeżeń!".format(member.mention))
  190.             return
  191.         warn_count = len(warns[member.id]["warns"])
  192.         if warn_count == 0:
  193.             await self.bot.say("Człowieku, {} nie ma ostrzeżeń!".format(member.mention))
  194.             return
  195.         if idx > warn_count:
  196.             await self.bot.say("Człowieku, index ostrzeżenia jest większy niż ilość ostrzeżeń użytkownika - ({})!".format(warn_count))
  197.             return
  198.         if idx < 1:
  199.             await self.bot.say("MNIEJ NIŻ 1? CHYBA SOBIE ŻARTUJESZ?!")
  200.             return
  201.         warn = warns[member.id]["warns"][idx - 1]
  202.         embed = discord.Embed(color=discord.Color.dark_red(), title="Warn {} on {}".format(idx, warn["timestamp"]),
  203.                               description="Issuer: {0[issuer_name]}\nReason: {0[reason]}".format(warn))
  204.         del warns[member.id]["warns"][idx - 1]
  205.         with open("data/warnsv2.json", "w") as f:
  206.             json.dump(warns, f)
  207.         await self.bot.say("Człowieku, zostało usunięte jedno ostrzeżenie dla {}!".format(member.mention))
  208.         msg = "🗑 **Warn removed**: {} deleted a warn issued by {} from {} | {}#{}".format(ctx.message.author.mention, idx, member.mention, member.name, member.discriminator)
  209.         await self.bot.send_message(logchannel, msg, embed=embed)
  210.  
  211.     @commands.has_permissions(manage_nicknames=True)
  212.     @commands.command(pass_context=True)
  213.     async def delwarnid(self, ctx, user_id, idx: int):
  214.         """Remove a specific warn from a user based on ID. Staff only."""
  215.         server = ctx.message.server
  216.         logchannel = discord.utils.get(server.channels, name="logi")
  217.         with open("data/warnsv2.json", "r") as f:
  218.             warns = json.load(f)
  219.         if user_id not in warns:
  220.             await self.bot.say("Człowieku, {} nie ma ostrzeżeń!".format(user_id))
  221.             return
  222.         warn_count = len(warns[user_id]["warns"])
  223.         if warn_count == 0:
  224.             await self.bot.say("Człowieku, {} nie ma ostrzeżeń!".format(warns[user_id]["name"]))
  225.             return
  226.         if idx > warn_count:
  227.             await self.bot.say("Człowieku, index ostrzeżenia jest większy niż ilość ostrzeżeń użytkownika - ({})!".format(warn_count))
  228.             return
  229.         if idx < 1:
  230.             await self.bot.say("MNIEJ NIŻ 1? CHYBA SOBIE ŻARTUJESZ?!")
  231.             return
  232.         warn = warns[user_id]["warns"][idx - 1]
  233.         embed = discord.Embed(color=discord.Color.dark_red(), title="Warn {} on {}".format(idx, warn["timestamp"]),
  234.                               description="Issuer: {0[issuer_name]}\nReason: {0[reason]}".format(warn))
  235.         del warns[user_id]["warns"][idx - 1]
  236.         with open("data/warnsv2.json", "w") as f:
  237.             json.dump(warns, f)
  238.         await self.bot.say("Człowieku, zostało usunięte jedno ostrzeżenie dla {}".format(warns[user_id]["name"]))
  239.         msg = "🗑 **Deleted warn**: {} removed warn {} from {} ({})".format(ctx.message.author.mention, idx, warns[user_id]["name"], user_id)
  240.         await self.bot.send_message(logchannel, msg, embed=embed)
  241.  
  242.     @commands.has_permissions(manage_nicknames=True)
  243.     @commands.command(pass_context=True)
  244.     async def clearwarns(self, ctx, user):
  245.         """Clear all warns for a user. Staff only."""
  246.         server = ctx.message.server
  247.         logchannel = discord.utils.get(server.channels, name="logi")
  248.         try:
  249.             member = ctx.message.mentions[0]
  250.         except IndexError:
  251.             await self.bot.say("ERROR, użytkownik nie został oznaczony.")
  252.             return
  253.         with open("data/warnsv2.json", "r") as f:
  254.             warns = json.load(f)
  255.         if member.id not in warns:
  256.             await self.bot.say("Człowieku, {} nie ma ostrzeżeń!".format(member.mention))
  257.             return
  258.         warn_count = len(warns[member.id]["warns"])
  259.         if warn_count == 0:
  260.             await self.bot.say("Człowieku, {} nie ma ostrzeżeń!".format(member.mention))
  261.             return
  262.         warns[member.id]["warns"] = []
  263.         with open("data/warnsv2.json", "w") as f:
  264.             json.dump(warns, f)
  265.         await self.bot.say("Człowieku, {} nie ma już żadnych ostrzeżeń!".format(member.mention))
  266.         msg = "🗑 **Cleared warns**: {} cleared {} warns from {} | {}#{}".format(ctx.message.author.mention, warn_count, member.mention, member.name, member.discriminator)
  267.         await self.bot.send_message(logchannel, msg)
  268.  
  269.     @commands.has_permissions(manage_nicknames=True)
  270.     @commands.command(pass_context=True)
  271.     async def clearwarnsid(self, ctx, user_id):
  272.         """Clear all warns for a user based on ID. Staff only."""
  273.         server = ctx.message.server
  274.         logchannel = discord.utils.get(server.channels, name="logi")
  275.         with open("data/warnsv2.json", "r") as f:
  276.             warns = json.load(f)
  277.         if user_id not in warns:
  278.             await self.bot.say("Człowieku, {} nie ma ostrzeżeń!".format(user_id))
  279.             return
  280.         warn_count = len(warns[user_id]["warns"])
  281.         if warn_count == 0:
  282.             await self.bot.say("Człowieku, {} nie ma ostrzeżeń!".format(warns[user_id]["name"]))
  283.             return
  284.         warns[user_id]["warns"] = []
  285.         with open("data/warnsv2.json", "w") as f:
  286.             json.dump(warns, f)
  287.         await self.bot.say("Człowieku, {} nie ma już żadnych ostrzeżeń!".format(warns[user_id]["name"]))
  288.         msg = "🗑 **Cleared warns**: {} cleared {} warns from {} ({})".format(ctx.message.author.mention, warn_count, warns[user_id]["name"], user_id)
  289.         await self.bot.send_message(logchannel, msg)
  290.  
  291. chars = "\\`*_<>#@:~"
  292. def escape_name(name):
  293.     name = str(name)
  294.     for c in chars:
  295.         if c in name:
  296.             name = name.replace(c, "\\" + c)
  297.     return name.replace("@", "@\u200b")  # prevent mentions
  298.  
  299. def setup(bot):
  300.     bot.add_cog(ModWarn(bot))
Add Comment
Please, Sign In to add comment