Beispiel #1
0
 async def log_ban_action(self,
                          member: Union[discord.Member, discord.User],
                          *,
                          soft: bool = False,
                          silent: bool = False,
                          reason: str = None,
                          banned: bool = False,
                          staff: discord.Member = None):
     action = "Soft-Banned" if soft else (
         " Banned" if banned else "Unbanned")
     emoji = emojis.softban if soft else (
         emojis.ban if banned else emojis.unban)
     if not silent:
         await self.modchannel.send(embed=discord.Embed(
             title=f"{emoji} User {action}",
             description=f"{member} | <@!{member.id}>\n",
             colour=config()["colors"]["ban"]))
     await self.logchannel.send(embed=discord.Embed(
         title=f"User {action}",
         description=f"{member} | <@!{member.id}>",
         colour=config()["colors"]["ban"]).add_field(
             name="Staff Member",
             value=f"{staff} | <@!{staff.id}>" if staff else "None",
             inline=False).add_field(name="Reason",
                                     value=reason if reason else "None",
                                     inline=False))
Beispiel #2
0
async def on_message(message: discord.Message):
    if message.author.bot or not message.guild:
        return
    anti_misfit_regex = r"\bs[kc]re+(?:ch)?\b"
    if re.findall(anti_misfit_regex, re.sub("[*.+?]", "", message.content.lower()), re.MULTILINE).__len__() != 0:
        await message.delete()
        await message.channel.send("No screeching please.", delete_after=30)
    hello_regex = rf"^\s*(?:hi|hiya|hi there|hello|hei|hola|hey),?\s*(?:[Kk]aede|<@!{str(bot.user.id)}>)[!\.]*\s*$"
    if message.content == "<@!" + str(bot.user.id) + ">":
        await message.channel.send(random.choice("I'm alive!,Hm?,Yea? :3,:D,That's me!".split(",")))
    if re.findall(hello_regex, message.content.lower(), re.MULTILINE).__len__() != 0:
        await message.channel.send(random.choice(["Hi, " + message.author.mention + " :3",
                                                  "Hey, " + message.author.display_name,
                                                  "Hi, " + message.author.display_name + " :3",
                                                  "Hey, " + message.author.mention,
                                                  "Hello :D"]))
        return
    if any([s in message.content for s in config()["kaedemojis"]]):
        await message.add_reaction(utils.letter_emoji("M"))
        await message.add_reaction(utils.letter_emoji("E"))
        await message.add_reaction("\u2755")
        await message.add_reaction([e for e in message.guild.emojis if e.id == 715315690105733234][0])
    if message.content == "(╯°□°)╯︵ ┻━┻":
        await message.channel.send("┬─┬ ノ( ゜-゜ノ)")
        if random.randint(1, 10) == 1:
            await message.channel.send(random.choice(config()["no-table-flip"]))
    await bot.process_commands(message)
Beispiel #3
0
 async def on_member_join(self, member: discord.Member):
     if config()["autokick"] > 0:
         now = datetime.utcnow()
         td = timedelta(days=config()["autokick"])
         diff: timedelta = now - member.created_at
         if diff < td:
             try:
                 await member.send(
                     AUTOKICK_STR.format(user=member.mention,
                                         guild=member.guild.name,
                                         age=config()["autokick"]))
             except discord.Forbidden:
                 dm_sent = False
             else:
                 dm_sent = True
             await self.log_message(
                 "User Denied Entry",
                 f"Member {member} ({member.id}) was denied "
                 f"entry because their account was newer than "
                 f"{config()['autokick']} days\n"
                 f"DM was {'not ' if not dm_sent else ''}sent",
                 emoji=emojis.autokick_on)
             self.suppressed_leaves.append(member.id)
             await asyncio.sleep(1)
             await member.kick(reason="Autokick enabled, account too new")
             return
     await self.log_user(member, True)
Beispiel #4
0
 async def log_mute_action(self,
                           member: Union[discord.Member, discord.User],
                           *,
                           muted: bool = True,
                           manual: bool = False,
                           seconds: int = None,
                           staff: discord.Member = None,
                           rule: str = None):
     if muted:
         await self.logchannel.send(
             embed=discord.Embed(
                 title=f"{emojis.mute} User Muted",
                 description=f"{member} | <@!{member.id}>",
                 colour=config()["colors"]["mute"]).add_field(
                     name="Staff Member",
                     value=f"{staff} | <@!{staff.id}>" if staff else "None",
                     inline=False).add_field(
                         name="Type",
                         value="Manual" if manual else f"Auto {rule}").
             add_field(name="Time",
                       value=seconds_to_str(seconds) if seconds else "N/A"))
     else:
         await self.logchannel.send(embed=discord.Embed(
             title=f"{emojis.un} User Unmuted",
             description=f"{member} | <@!{member.id}>",
             colour=config()["colors"]["mute"]).add_field(
                 name="Staff Member",
                 value=f"{staff} | <@!{staff.id}>" if staff else "None",
                 inline=False).add_field(
                     name="Type", value="Manual" if manual else "Auto"))
Beispiel #5
0
    async def delfilteredtoken(self, ctx: commands.Context, n: int):
        """
        Delete a filtered token
        #STAFF
        """
        if n < 0 or n >= len(config()["filters"]["token_blacklist"]):
            await ctx.send("Invalid number - do `!lfw` to view")
        conf = BotConfirmation(ctx, 0x5555ff)
        await conf.confirm(
            f'Delete `{config()["filters"]["token_blacklist"][n]}`?')

        if conf.confirmed:
            try:
                s = config()["filters"]["token_blacklist"][n]
                del config()["filters"]["token_blacklist"][n]
                save_config()
            except Exception as e:  # noqa e722
                await conf.update("An error occurred", color=0xffff00)
            else:
                await conf.update("Deleted!", color=0x55ff55)
                await self.modlog.log_message("Filter Token Modification",
                                              f"```diff\n - {s}```",
                                              ctx.author)
        else:
            await conf.update("Canceled", color=0xff5555)
Beispiel #6
0
    async def delstatus(self, ctx, n: int):
        """
        Deletes a status
        #OWNER
        """
        if len(config()["statuses"]) == 1:
            await ctx.send("Can't delete only status, do `!resetstatus`")
            return
        if n < 0 or n >= len(config()["statuses"]):
            await ctx.send("Invalid index, do `!liststatus`")
            return
        conf = BotConfirmation(ctx, 0x5555ff)
        await conf.confirm(f'Delete `{config()["statuses"][n]}`?')

        if conf.confirmed:
            try:
                s = config()["statuses"][n]
                del config()["statuses"][n]
                save_config()
                self.status = cycle(config()["statuses"])
                self.status_rotate.restart()
            except Exception as e:  # noqa e722
                await conf.update("An error occurred", color=0xffff00)
            else:
                await conf.update("Deleted!", color=0x55ff55)
                await self.modlog.log_message("Status Modification", f"```diff\n - {s}```", ctx.author)
        else:
            await conf.update("Canceled", color=0xff5555)
Beispiel #7
0
 async def _init(self):
     logging.info("[MODLOG] Waiting for bot")
     await self.bot.wait_until_ready()
     self.logchannel = self.bot.get_channel(config()["channels"]["log"])
     self.modchannel = self.bot.get_channel(config()["channels"]["modlog"])
     self.greeting = self.bot.get_channel(config()["channels"]["greeting"])
     self.operator = self.bot.get_guild(586199960198971409).get_role(
         config()["roles"]["operator"])
     logging.info("[MODLOG] Ready")
 async def _init(self):
     logging.info("[MOD] Waiting for bot")
     await self.bot.wait_until_ready()
     self.modlog = self.bot.get_cog("ModLog")
     self.punishments = self.bot.get_cog("Punishments")
     self.muted_role = self.bot.get_guild(586199960198971409).get_role(
         config()["roles"]["muted"])
     self.staff = self.bot.get_guild(586199960198971409).get_role(
         config()["roles"]["staff"])
     for i in self.muted_role.members:
         self.active_mutes.append(i.id)
     logging.info("[MOD] Ready")
Beispiel #9
0
 async def _init(self):
     logging.info("[SERVER] Waiting for bot")
     await self.bot.wait_until_ready()
     self.modlog = self.bot.get_cog("ModLog")
     self.staff = self.bot.get_guild(586199960198971409).get_role(
         config()["roles"]["staff"])
     self.jr_mod = self.bot.get_guild(586199960198971409).get_role(
         config()["roles"]["jr_mod"])
     self.mod = self.bot.get_guild(586199960198971409).get_role(
         config()["roles"]["mod"])
     self.admin = self.bot.get_guild(586199960198971409).get_role(
         config()["roles"]["admin"])
     self.owner = self.bot.get_guild(586199960198971409).get_role(
         config()["roles"]["owner"])
     logging.info("[SERVER] Ready")
Beispiel #10
0
 async def log_edit(self, before: discord.Message, after: discord.Message):
     if config()["logging"]["ignore_bot"] and before.author.bot:
         return
     msg = await self.logchannel.send(embed=discord.Embed(
         title=f"{emojis.edit} Message Edited in #{before.channel.name}",
         description=f"{before.author} | {before.author.id}\n"
         f"[Jump to message]({before.jump_url})",
         colour=config()["colors"]["edit"]).add_field(
             name="Before", value=trim(before.content))  # noqa 141
                                      .add_field(name="After",
                                                 value=trim(after.content)))
     logging.log(
         15,
         f"[MODLOG | EDIT] {msg.id}\n---\n{quote(before.content)}\n---\n{quote(after.content)}"
     )
Beispiel #11
0
 def __init__(self, bot: commands.Bot):
     self.bot = bot
     self.modlog: Optional[cogs.administration.modlog.ModLog] = None
     self.moderation: Optional[
         cogs.administration.moderation.Moderation] = None
     bot.loop.create_task(self._init())
     self._cooldowns: Dict[str, commands.CooldownMapping] = {}
     self._cd_vals: Dict[str, Tuple[float, float]] = {}
     for rule in ["burst"]:
         self._cooldowns[rule] = commands.CooldownMapping.from_cooldown(
             float(config()["automod"][rule]["number"]),
             float(config()["automod"][rule]["interval"]),
             commands.BucketType.member)
         self._cd_vals[rule] = (float(config()["automod"][rule]["number"]),
                                float(config()["automod"][rule]["number"]))
Beispiel #12
0
 async def reloadconfig(self, ctx):
     """
     Reload bot config
     #OWNER
     """
     await ctx.send("Reloading config...")
     try:
         reload_config()
         self.status = cycle(config()["statuses"])
         self.status_rotate.change_interval(seconds=config()["status_cycle"])
         self.status_rotate.restart()
     except Exception as e:  # noqa e722
         await ctx.send("An error occ ured")
         raise e
     else:
         await ctx.send("Config reloaded! :D")
Beispiel #13
0
 async def silence_channel(self, channel: discord.TextChannel):
     if channel.overwrites_for(
             channel.guild.default_role).send_messages is False:
         await self.modlog.log_message(
             "Channel already silenced",
             f"Channel <#{channel.id}> already silenced", channel.guild.me)
         return False
     if channel.category and channel.category.id in config(
     )["restricted_categories"]:
         await self.modlog.log_message(
             "Channel not silenced",
             f"Channel <#{channel.id}> in a restricted category",
             channel.guild.me)
         return False
     self.overwrite_restore[channel.id] = \
         channel.overwrites_for(channel.guild.default_role).send_messages
     perms: discord.PermissionOverwrite = channel.overwrites_for(
         channel.guild.default_role)
     perms.update(send_messages=False)
     await channel.set_permissions(channel.guild.default_role,
                                   overwrite=perms)
     perms: discord.PermissionOverwrite = channel.overwrites_for(self.staff)
     perms.update(send_messages=True)
     await channel.set_permissions(self.staff, overwrite=perms)
     return True
Beispiel #14
0
 async def _init(self):
     logging.info("[PROTECT] Waiting for bot")
     await self.bot.wait_until_ready()
     self.modlog = self.bot.get_cog("ModLog")
     self.staff = self.bot.get_guild(586199960198971409).get_role(
         config()["roles"]["staff"])
     logging.info("[PROTECT] Ready")
Beispiel #15
0
 async def listfilteredwords(self, ctx: commands.Context):
     """
     Lists the filtered words
     #STAFF
     """
     await BotEmbedPaginator(
         ctx,
         pages(numbered(config()["filters"]["word_blacklist"]), 10,
               "Filtered Words")).run()
Beispiel #16
0
 async def autokick(self, ctx: commands.Context, days: int = None):
     """
     Set the threshold age to kick new accounts at
     !ak - shows current state
     !ak 4 - set to 4 days
     !ak 0 - turn off
     #STAFF
     """
     if days is None:
         st = "off" if config()["autokick"] == 0 else f"kicking accounts newer than " \
                                                      f"{config()['autokick']} days"
         await ctx.send(f"{self._get_autokick_emoji()} Autokick is {st}")
         return
     config()['autokick'] = days
     save_config()
     st = "off" if config()["autokick"] == 0 else f"kicking accounts newer than " \
                                                  f"{config()['autokick']} days"
     await ctx.send(f"{self._get_autokick_emoji()} Autokick is {st}")
Beispiel #17
0
 async def log_delete(self, message: discord.Message):
     if message.id in self.suppressed_deletion_messages:
         del self.suppressed_deletion_messages[
             self.suppressed_deletion_messages.index(message.id)]
         return
     if config()["logging"]["ignore_bot"] == 1 and message.author.bot:
         return
     for i in config()["logging"]["ignore_del_prefix"]:
         if message.content.startswith(i):
             return
     msg = await self.logchannel.send(embed=discord.Embed(
         title=f"{emojis.delete} Message Deleted in #{message.channel.name}",
         description=f"{message.author} | {message.author.id}\n",
         colour=config()["colors"]["delete"],
         timestamp=message.created_at).add_field(
             name="Content", value=trim(message.content))  # noqa 141
                                      .set_footer(text="Send time"))
     logging.log(15, f"[MODLOG | DELETE] {msg.id}: {msg.content}")
Beispiel #18
0
 async def _init(self):
     logging.info("[KAEDE] Waiting for bot")
     await self.bot.wait_until_ready()
     self.status = cycle(config()["statuses"])
     self.status_rotate.start()
     self.modlog = self.bot.get_cog("ModLog")
     await self.bot.change_presence(status=discord.Status.do_not_disturb,
                                    activity=discord.Game(name=self.status.__next__()))
     logging.info("[KAEDE] Ready")
Beispiel #19
0
 async def listfilteredtoken(self, ctx: commands.Context):
     """
     Lists filtered tokens
     #STAFF
     """
     await BotEmbedPaginator(
         ctx,
         pages(numbered(config()["filters"]["token_blacklist"]), 10,
               "Filtered Tokens")).run()
Beispiel #20
0
 async def log_message(self,
                       title: str,
                       message: str,
                       author: discord.Member = None,
                       emoji: str = None):
     embed = discord.Embed(title=f"{emoji} {title}" if emoji else title,
                           description=message,
                           colour=config()["colors"]["log_message"])
     if author:
         embed.set_author(name=f"{author} | {author.id}")
     await self.logchannel.send(embed=embed)
Beispiel #21
0
 async def log_kick_action(self,
                           member: Union[discord.Member, discord.User],
                           *,
                           silent: bool = False,
                           reason: str = None,
                           staff: discord.Member = None):
     if not silent:
         await self.modchannel.send(embed=discord.Embed(
             title="User Kicked",
             description=f"{member} | <@!{member.id}>\n",
             colour=config()["colors"]["kick"]))
     await self.logchannel.send(embed=discord.Embed(
         title="User Kicked",
         description=f"{member} | <@!{member.id}>",
         colour=config()["colors"]["kick"]).add_field(
             name="Staff Member",
             value=f"{staff} | <@!{staff.id}>" if staff else "None",
             inline=False).add_field(name="Reason",
                                     value=reason if reason else "None",
                                     inline=False))
Beispiel #22
0
 async def color(self, ctx: commands.Context, clr: discord.Color):
     """
     changes the color of your custom staff role
     #STAFF
     """
     if config()["roles"]["staff"] not in [r.id for r in ctx.author.roles]:
         await ctx.send("Um. *no you can't do that*")
         return
     m: discord.Member = ctx.author
     await m.top_role.edit(color=clr)
     await ctx.send(":)")
Beispiel #23
0
    async def resetstatus(self, ctx: commands.Context):
        """
        Clear status list
        #OWNER
        """
        conf = BotConfirmation(ctx, 0x5555ff)
        await conf.confirm('Reset status list?')

        if conf.confirmed:
            try:
                config()["statuses"] = ["Hi"]
                save_config()
                self.status = cycle(config()["statuses"])
                self.status_rotate.restart()
            except Exception as e:  # noqa e722
                await conf.update("An error occurred", color=0xffff00)
            else:
                await conf.update("Reset!", color=0x55ff55)
                await self.modlog.log_message("Status Modification", "```# Reset #```", ctx.author)
        else:
            await conf.update("Canceled", color=0xff5555)
Beispiel #24
0
 async def _is_allowed_for(self, hs_parsed: Tuple[str, List[str]],
                           ctx: commands.Context):
     if not hs_parsed[1]:
         return True
     for r in hs_parsed[1]:
         if r == "#STAFF" and config()["roles"]["staff"] in [
                 r.id for r in ctx.author.roles
         ]:
             return True
         if r == "#OWNER" and await self.bot.is_owner(ctx.author):
             return True
     return False
Beispiel #25
0
    async def addfilteredword(self, ctx: commands.Context, *, w: str):
        """
        Add a filtered word
        #STAFF
        """
        w = w.strip("` ")
        conf = BotConfirmation(ctx, 0x5555ff)
        await conf.confirm(f'Add `{w}`?')

        if conf.confirmed:
            try:
                config()["filters"]["word_blacklist"].append(w)
                save_config()
            except Exception as e:  # noqa e722
                await conf.update("An error occurred", color=0xffff00)
            else:
                await conf.update("Added!", color=0x55ff55)
                await self.modlog.log_message("Filter Word Modification",
                                              f"```diff\n + {w}```",
                                              ctx.author)
        else:
            await conf.update("Canceled", color=0xff5555)
Beispiel #26
0
 async def log_filter(self, flt: str, message: discord.Message):
     msg = await self.logchannel.send(embed=discord.Embed(
         title=
         f"{emojis.filter} Message Filtered in #{message.channel.name}",
         description=f"{message.author} | {message.author.id}\n",
         colour=config()["colors"]["filter"]).add_field(
             name="Content", value=trim(message.content))  # noqa 141
                                      .set_footer(text=f"Rule: {flt}"))
     self.suppressed_deletion_messages.append(message.id)
     logging.log(
         15,
         f"[MODLOG | FILTER] {msg.id} A:{message.author.id} R:{flt} {message.content}"
     )
Beispiel #27
0
    async def addstatus(self, ctx: commands.Context, *, w: str):
        """
        Adds a status
        #OWNER
        """
        w = w.strip("` ")
        conf = BotConfirmation(ctx, 0x5555ff)
        await conf.confirm(f'Add `{w}`?')

        if conf.confirmed:
            try:
                config()["statuses"].append(w)
                save_config()
                self.status = cycle(config()["statuses"])
                self.status_rotate.restart()
            except Exception as e:  # noqa e722
                await conf.update("An error occurred", color=0xffff00)
            else:
                await conf.update("Added!", color=0x55ff55)
                await self.modlog.log_message("Status Modification", f"```diff\n + {w}```", ctx.author)
        else:
            await conf.update("Canceled", color=0xff5555)
Beispiel #28
0
 async def log_warn_action(self,
                           member: discord.Member,
                           *,
                           reason: str = None,
                           staff: discord.Member = None):
     await self.logchannel.send(embed=discord.Embed(
         title="User Warned",
         description=f"{member} | <@!{member.id}>",
         colour=config()["colors"]["warn"]).add_field(
             name="Staff Member",
             value=f"{staff} | <@!{staff.id}>" if staff else "None",
             inline=False).add_field(name="Reason",
                                     value=reason if reason else "None",
                                     inline=False))
Beispiel #29
0
 async def role(self, ctx: commands.Context, *, role: str):
     """
     changes the name of your custom staff role
     #STAFF
     """
     if config()["roles"]["staff"] not in [r.id for r in ctx.author.roles]:
         await ctx.send("Um. *no you can't do that*")
         return
     if len(role) > 32:
         await ctx.send("You...want to name it...*what*?")
         return
     m: discord.Member = ctx.author
     await m.top_role.edit(name=role)
     await ctx.send(":)")
Beispiel #30
0
 async def help(self, ctx: commands.Context, *, cmd_s: str = None):
     if cmd_s:
         cmd: commands.Command
         cmd = self.bot.get_command(cmd_s)
         if not cmd:
             for cmd in self.bot.commands:
                 if cmd_s in cmd.aliases:
                     break
             else:
                 return await ctx.send(embed=discord.Embed(
                     title="Command not found",
                     description=f"Command `{cmd_s}` is not a valid command"
                 ))
         if cmd.name in "ban,sban,softban,kick,skick".split(","):
             return await ctx.send(embed=discord.Embed(
                 title=cmd.name,
                 description=cogs.administration.moderation.MOD_HELP_STR))
         s, roles = parse_help_str(cmd.callback.__doc__)
         return await ctx.send(embed=discord.Embed(
             title=cmd.name,
             description=(roles[0].strip("# ") if roles else "") +
             f"\n{s.strip(NL)}\n" +  # noqa e131
             ("Aliases: " + ",".join(f"`{x}`" for x in cmd.aliases) +
              "\n" if cmd.aliases else "")))
     cmds: List[commands.Command] = sorted(self.bot.commands,
                                           key=lambda x: x.cog_name)
     lst = []
     for i in cmds:
         if i.callback.__doc__:
             s, roles = parse_help_str(i.callback.__doc__)
         else:
             continue
         if await self._is_allowed_for((s, roles), ctx):
             if s.strip("\n "):
                 s = s.strip("\n ").splitlines(keepends=False)[0]
             lst.append(f"`{i.name.strip()}`:  " +
                        (roles[0].strip("# ") if roles else "") + "\n" + s +
                        "\n" + ("Aliases: " + ",".join(f"`{x}`"
                                                       for x in i.aliases) +
                                "\n" if i.aliases else ""))
     embeds = pages(lst, 7, "Help", fmt="%s")
     if config()["roles"]["staff"] in [r.id for r in ctx.author.roles]:
         embeds.append(
             discord.Embed(
                 title="Help",
                 description=cogs.administration.moderation.MOD_HELP_STR))
     await BotEmbedPaginator(ctx, embeds).run()
 def get(self):
     self.write("In StopTornado " + config("PORT"))
Beispiel #32
0
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from libs import config
cfg = config.config('../etc/config.json')

MAX = 9
MIN = 0

class Cell(list):
    def __init__(self, y, x):
        super().__init__()
        self.extend([y, x])
        self.y = y
        self.x = x
        self.reset()

    @property
    def distance_to_obstacles_x(self):
        return self._distance_to_obstacles_x

    @distance_to_obstacles_x.setter
    def distance_to_obstacles_x(self, obstacles):
        self._distance_to_obstacles_x = obstacles - self.x

    @property
    def distance_to_obstacles_y(self):
        return self._distance_to_obstacles_y

    @distance_to_obstacles_y.setter
    def distance_to_obstacles_y(self, obstacles):