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))
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)
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)
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"))
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)
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)
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")
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")
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)}" )
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"]))
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")
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
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")
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()
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}")
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}")
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")
async def listfilteredtoken(self, ctx: commands.Context): """ Lists filtered tokens #STAFF """ await BotEmbedPaginator( ctx, pages(numbered(config()["filters"]["token_blacklist"]), 10, "Filtered Tokens")).run()
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)
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))
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(":)")
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)
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
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)
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}" )
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)
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))
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(":)")
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"))
#!/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):