Example #1
0
    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}.")
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
    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)
Example #5
0
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()
Example #6
0
    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)
Example #7
0
    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)
Example #8
0
    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.")
Example #9
0
    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.")
Example #10
0
    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)
Example #11
0
    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}'.")
Example #12
0
    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)
Example #13
0
    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)
Example #14
0
    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)
Example #15
0
        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))