async def set_yoink(self, ctx, arg, message_id: Optional[int]): message_id = message_id or None if arg == "clear" or arg == "clr": db.execute("UPDATE guilds SET yoinker_id = ? WHERE guild_id = ?;", None, ctx.guild.id) db.commit() embed = create_embed( "Yoinker Message Cleared", f"Yoinker message was cleared by {ctx.message.author}", color=Color.red()) log_channel = self.bot.get_log_channel(ctx.guild.id) if log_channel is not None: await log_channel.send(embed=embed) await ctx.send(f"Successfully cleared yoinker.") return elif arg == "set": if message_id is None: await ctx.send("Please enter a valid message ID.") return else: print("returning") return message = await ctx.fetch_message(message_id) if message_id == get_guild_yoinker(ctx.guild.id): await ctx.send("Yoinker already set to that message.") # elif not re.match("\d", message_id): # await ctx.send("Invalid message ID. Enter message ID for reaction emote yoinker.") else: db.execute("UPDATE guilds SET yoinker_id = ? WHERE guild_id = ?;", message_id, ctx.guild.id) db.commit() self.bot.reaction_yoink = message_id embed = create_embed( "New Yoinker Message Set", f"Yoinker message set to message with id {message_id}. {message.jump_url} by {ctx.message.author}.", color=Color.dark_magenta()) log_channel = self.bot.get_log_channel(ctx.guild.id) if log_channel is not None: await log_channel.send(embed=embed) await ctx.send( f"Successfully set yoinker to message with id {message_id}.")
async def add_xp(self, message, xp, lvl): xp_to_add = randint(5, 15) new_lvl = int(((xp + xp_to_add) // 42)**0.55) points_to_add = new_lvl * 10 # exp lock set to 1 min for now db.execute( "UPDATE member_exp SET xp = xp + ?, level = ?, xp_lock = ? WHERE member_id = ? AND guild_id = ?;", xp_to_add, new_lvl, (datetime.utcnow() + timedelta(seconds=60)).isoformat(), message.author.id, message.guild.id) if new_lvl > lvl: # awarding points for leveling up db.execute( "UPDATE member_points SET points = points + ? WHERE member_id = ? AND guild_id = ?;", points_to_add, message.author.id, message.guild.id) db.commit( ) # users are probably immediately going to check for points # level notification enabled? if guild_lvl_enabled(message.guild.id): embed = create_embed( f"Level Up!", f"Yay! {message.author.mention}, you've reached level {new_lvl:,}. \n{points_to_add} points have been awarded to your account.", color=Color.magenta(), image_url=message.author.avatar_url) # if notifications are toggled, will send to specific channel if exists, otherwise the channel # with the message that leveled the user lvl_channel = self.bot.get_guild_lvl_channel(message.guild.id) if lvl_channel is not None: await lvl_channel.send(embed=embed) else: await message.channel.send(embed=embed)
async def display_rank(self, ctx): ranks = db.records( "SELECT * FROM member_exp WHERE guild_id = ? ORDER BY xp DESC;", ctx.guild.id) fields = [] for i, rank in enumerate(ranks): if i > 9: break try: user = await self.bot.fetch_user(rank[0]) except NotFound as e: i -= 1 continue fields.append(("**Rank**", f"{i+1}", True)) fields.append(("**Member**", f"{user}", True)) fields.append(("**LVL (XP)**", f"{rank[3]} ({rank[2]}XP)", True)) embed = create_embed("Level Ranking", f"Member level rankings for {ctx.guild.name}.", fields=fields, color=Color.magenta()) await ctx.send(embed=embed)
async def on_raw_reaction_add(self, payload): guild = self.bot.get_guild(payload.guild_id) log_channel = self.bot.get_log_channel(payload.guild_id) if int(payload.message_id) == get_guild_yoinker(payload.guild_id): # need permission to manage server if not payload.member.guild_permissions.manage_guild: return emoji = payload.emoji if emoji in guild.emojis: print("emoji already exists") return try: response = requests.get(emoji.url) await guild.create_custom_emoji(name=emoji.name, image=response.content) except HTTPException: if log_channel is not None: await log_channel.send( f"Problem adding emoji {emoji.name}.") return embed = create_embed(f"Emoji added to {guild.name}!", f"{emoji.name}", image_url=emoji.url, color=Color.dark_teal()) if log_channel is not None: await log_channel.send(embed=embed)
class Mal(Cog): def __init__(self, bot): self.bot = bot @cooldown(2, 20, BucketType.user) @command(name="anime", aliases=["mal"]) async def mal(self, ctx, *, query): jikan = AioJikan() try: result = await jikan.search("anime", query) except APIException: await ctx.send("Problem connecting to the API. Please try again.") await jikan.close() return #taking first result for now if len(result["results"]) > 0: result = result["results"][0] else: await ctx.send(f"No results for <{query}>.") await jikan.close() return try: anime = await jikan.anime(result.get("mal_id")) except APIException: await ctx.send("Problem connecting to the API. Please try again.") await jikan.close() return title = anime.get("title") title_japanese = anime.get("title_japanese") anime_type = anime.get("type") url = anime.get("url") image = anime.get("image_url") airing = anime.get("airing") aired = anime["aired"].get("string") synopsis = anime.get("synopsis") score = anime.get("score") broadcast = "N/A" if airing: broadcast = anime.get("broadcast") if (episodes := anime.get("episodes")) is None: episodes = "N/A" fields = [("**Type**:", anime_type, False), ("**URL**:", url, False), ("**Aired :**", aired, True), ("**Broadcast :**", broadcast, True), ("**Score:**", score, True), ("**Episodes:**", episodes, True)] embed = create_embed(title=u"{}【{}】".format(title, title_japanese), description=f"\"{synopsis}\"", color=0x003F87, image_url=image, fields=fields) await ctx.send(embed=embed) await jikan.close()
async def display_assets(self, ctx, member: Optional[Member]): member = member or ctx.author guild_house, workers, points = db.record( "SELECT guild_house, workers, points FROM member_points WHERE member_id = ? AND guild_id = ?;", member.id, member.guild.id) result = "" net_worth = points if int(guild_house) == 1: net_worth += 5000 result += ":house: Owns a guild house\n" if int(workers) > 0: net_worth += int(workers) * 3000 result += f":tools: {workers} workers\n" if points is not None: result += f":purse: {points}\n" elif points is None and int(guild_house) == 0: await ctx.send("That member does not have any asset data.") return embed = create_embed(f":bank: {member.display_name}'s Assets", f"{result}\n**net worth**: {net_worth} :coin:", color=Color.blue(), thumbnail_url=member.avatar_url) await ctx.send(embed=embed)
async def on_message_delete(self, message): if message.author.bot: return fields = [("**Message:**", message.content, False)] embed = create_embed("Message deleted", f"Original message by {message.author}.", color=Color.gold(), thumbnail_url=message.author.avatar_url, fields=fields) log_channel = self.bot.get_log_channel(message.guild.id) if log_channel is not None: await log_channel.send(embed=embed)
async def display_points(self, ctx, member: Optional[Member]): member = member or ctx.author points = db.field( "SELECT points FROM member_points WHERE member_id = ? AND guild_id = ?;", member.id, member.guild.id) if points is not None: embed = create_embed("Points :purse:", f"{member.display_name} has {points} :coin:.", color=Color.blue(), thumbnail_url=member.avatar_url) await ctx.send(embed=embed) else: await ctx.send("That member does not have any point data.")
async def display_exp(self, ctx, member: Optional[Member]): member = member or ctx.author xp, lvl = db.record( "SELECT xp, level FROM member_exp WHERE member_id = ? AND guild_id = ?;", member.id, member.guild.id) or (None, None) if lvl is not None: embed = create_embed( "Level", f"{member.display_name} is level {lvl:,} with {xp:,} XP.", color=Color.teal(), thumbnail_url=member.avatar_url) await ctx.send(embed=embed) else: await ctx.send("That member does not have any exp data.")
async def set_log_channel(self, ctx, arg, channel: TextChannel): if arg != "channel": await ctx.send("Invalid argument. !log channel #log-channel") elif self.bot.get_channel(channel.id) is None: await ctx.send("Invalid channel.") else: db.execute("UPDATE guilds SET log_channel = ? WHERE guild_id = ?;", channel.id, ctx.guild.id) db.commit() await ctx.send(f"Log channel set to <#{channel.id}>.") embed = create_embed("Log Channel Set", f"New Log Channel Set to <#{channel.id}>.", color=Color.gold()) log_channel = self.bot.get_log_channel(ctx.guild.id) if log_channel is not None: await log_channel.send(embed=embed)
async def change_prefix(self, ctx, new: str): if len(new) > 5: await ctx.send("Prefix should be less than 5 characters in lenght." ) else: db.execute("UPDATE guilds SET prefix = ? WHERE guild_id = ?;", new, ctx.guild.id) db.commit() embed = create_embed( "New Prefix Set", f"New Prefix Set to {new} by {ctx.message.author}.", color=Color.green()) log_channel = self.bot.get_log_channel(ctx.guild.id) if log_channel is not None: await log_channel.send(embed=embed) await ctx.send(f"Prefix set to '{new}'.")
async def ban(self, ctx, members: Greedy[Member], *, reason="None"): if not len(members): await ctx.send("Please specify a user to be banned.") for member in members: await member.ban(reason=reason) fields = [("**User**:", f"{member} <@{member.id}>", False), ("**Reason**:", reason, False), ("**Banned by**:", ctx.message.author, False)] embed = create_embed("Banned", "", color=0xFF0000, thumbnail_url=member.avatar_url, fields=fields) log_channel = self.bot.get_log_channel(ctx.guild.id) if log_channel is not None: await log_channel.send(embed=embed)
async def clear(self, ctx, amount=5): author = ctx.author f_msg = f"""```diff - {author} deleted {amount} messages. ``` """ field = [("**Deleted by:**", ctx.message.author, False)] embed = create_embed("Message deleted", f"{amount} deleted in <#{ctx.channel.id}>.", color=Color.gold(), thumbnail_url=ctx.author.avatar_url, fields=field) await ctx.channel.purge(limit=amount + 1) await ctx.send(f_msg, delete_after=5) log_channel = self.bot.get_log_channel(ctx.guild.id) if log_channel is not None: await log_channel.send(embed=embed)
async def level(self, ctx, arg, channel: TextChannel = None): if arg == "toggle" or arg == "t": guild_toggle = db.field( "SELECT lvl_toggle FROM guilds WHERE guild_id = ?;", ctx.guild.id) on_off = "" if guild_toggle == 1: on_off = "Off" db.execute( "UPDATE guilds SET lvl_toggle = 0 WHERE guild_id = ?;", ctx.guild.id) db.commit() await ctx.send("Level notificationgs disabled.") else: on_off = "On" db.execute( "UPDATE guilds SET lvl_toggle = 1 WHERE guild_id = ?;", ctx.guild.id) db.commit() await ctx.send("Level notificationgs enabled.") embed = create_embed( f"Level Notification Toggled {on_off}", f"Level notifications toggled by {ctx.message.author}.", color=Color.gold()) log_channel = self.bot.get_log_channel(ctx.guild.id) if log_channel is not None: await log_channel.send(embed=embed) return if arg == "clear" or arg == "clr": db.execute("UPDATE guilds SET lvl_channel = ? WHERE guild_id = ?;", None, ctx.guild.id) db.commit() embed = create_embed( "Level Channel Cleared", f"Level channel was cleared by {ctx.message.author}.", color=Color.red()) log_channel = self.bot.get_log_channel(ctx.guild.id) if log_channel is not None: await log_channel.send(embed=embed) await ctx.send(f"Successfully cleared level channel.") return if arg != "channel": await ctx.send("Invalid argument. !level channel #lvl-channel") elif self.bot.get_channel(channel.id) is None: await ctx.send("Invalid channel.") else: db.execute("UPDATE guilds SET lvl_channel = ? WHERE guild_id = ?;", channel.id, ctx.guild.id) db.commit() await ctx.send(f"Level channel set to <#{channel.id}>.") embed = create_embed( "Level Channel Set", f"New Level Channel Set to <#{channel.id}> by {ctx.message.author}.", color=Color.gold()) log_channel = self.bot.get_log_channel(ctx.guild.id) if log_channel is not None: await log_channel.send(embed=embed)
title = manga.get("title") title_japanese = manga.get("title_japanese") url = manga.get("url") image = manga.get("image_url") synopsis = manga.get("synopsis") published = manga["published"].get("string") score = manga.get("score") broadcast = "N/A" if (chapters := manga.get("chapters")) is None: chapters = "N/A" fields = [("**URL**:", url, False), ("**Published :**", published, True), ("**Score:**", score, True), ("**Chapters:**", chapters, True)] embed = create_embed(title=u"{}【{}】".format(title, title_japanese), description=f"\"{synopsis}\"", color=0x003F87, image_url=image, fields=fields) await ctx.send(embed=embed) await jikan.close() # asyncio.run(jikan()) def setup(bot): bot.add_cog(Mal(bot))