예제 #1
0
    async def ask(self, ctx, member: discord.Member):
        user: User = UserDB.get_one(ctx.author.id)
        lover: User = UserDB.get_one(member.id)

        def check(m):
            return m.author == member and m.channel == ctx.channel

        if user.married:
            em = await Embeds.already_married(ctx.author)
            await ctx.send(embed=em)
        elif lover.married:
            em = await Embeds.is_married(member)
            await ctx.send(embed=em)
        else:
            em = await Embeds.ask_to_marry(ctx.author, member)
            await ctx.send(embed=em)
            try:
                message = await self.bot.wait_for('message',
                                                  check=check,
                                                  timeout=300)
            except asyncio.TimeoutError:
                await ctx.send(
                    "{}, you did not answer quickly enough, if it is an error, repeat the procedure."
                    .format(member.name),
                    delete_after=5)
            else:
                if message.content.lower() == "yes":
                    UserDB.set_lover(ctx.author.id, member.id)
                    em = await Embeds.said_yes(ctx.author, member)
                    await ctx.send(embed=em)
                else:
                    em = await Embeds.said_no(ctx.author, member)
                    await ctx.send(embed=em)
예제 #2
0
    async def divorce(self, ctx):
        user: User = UserDB.get_one(ctx.author.id)

        if not user.married:
            em = await Embeds.is_not_married(ctx.author)
            await ctx.send(embed=em)
        else:
            UserDB.unset_lover(ctx.author.id, user.lover)

            lover: discord.User = self.bot.get_user(user.lover)
            if not lover:
                return await ctx.send("You're now divorced !")
            em = await Embeds.divorce(ctx.author, lover)
            await ctx.send(embed=em)
예제 #3
0
 async def update_names(self, ctx):
     for guild in self.bot.guilds:
         G = GuildDB.get_one(guild_id=guild.id)
         GuildDB.update_name(guild.id, guild.name)
         if guild.id in [
                 488765635439099914, 631811291568144384, 618414922556112916,
                 740622438282428416
         ]:
             for user in guild.members:
                 if not user.bot:
                     U = UserDB.get_one(user.id)
                     UserDB.update_name(
                         user.id, "{}#{}".format(user.name.lower(),
                                                 user.discriminator))
예제 #4
0
    async def on_member_join(self, member):
        """

        :param member: The member who joined the guild
        """
        guild = GuildDB.get_one(member.guild.id)
        user = UserDB.get_one(member.id)

        # Check if the user has already been muted to avoid any sanctions bypass
        if UserDB.is_muted(guild, user):
            # Mute him again
            role = discord.utils.get(member.guild.roles, name="Muted")
            if not role:
                role = await member.guild.create_role(
                    name="Muted",
                    permissions=discord.Permissions.none(),
                    reason="Mute Role")
                for chan in member.guild.text_channels:
                    await chan.set_permissions(role, send_messages=False)
            await member.add_roles(role)

        # Check if the user is in the blacklist
        if BlacklistDB.is_blacklist(user):
            if GuildDB.has_blacklist(guild):
                # Ban the member
                await member.guild.ban(member, reason="Blacklist")
            try:
                await member.send(
                    "you're in the blacklist ! If you think it's an error, ask here --> "
                    "*****@*****.**")
            except discord.Forbidden:
                return

        if GuildDB.has_logging(guild):
            sanctions, time = await Checks().member_check(member)
            em = await Mod().check_embed(member, member.guild, sanctions, time)
            if guild.log_chan:
                channel = self.bot.get_channel(int(guild.log_chan))
                if isinstance(channel, discord.TextChannel):
                    try:
                        await channel.send(embed=em)
                    except discord.Forbidden:
                        return
예제 #5
0
    async def on_vip_message(message):
        user = UserDB.get_one(message.author.id)
        if not user.user_name or "{}#{}".format(
                message.author.name.lower(),
                message.author.discriminator) != user.user_name.lower():
            UserDB.update_name(
                message.author.id,
                "{}#{}".format(message.author.name.lower(),
                               message.author.discriminator))
        dt = message.created_at
        time = str(dt.year) + ("0" + str(dt.month) if dt.month < 10 else str(
            dt.month)) + ("0" + str(dt.day) if dt.day < 10 else str(dt.day))
        m = Message(guild_id=message.guild.id,
                    message_id=message.id,
                    user_id=message.author.id,
                    channel_id=message.channel.id,
                    time_id=int(time))

        MessageDB.insert_message(m)
예제 #6
0
 async def get(self, ctx, member: discord.Member = None):
     if not member:
         member: discord.Member = ctx.author
     user: User = UserDB.get_one(member.id)
     if user.married:
         lover: discord.User = self.bot.get_user(int(user.lover))
         if lover:
             em = await Embeds.get_lover(member, lover)
             await ctx.send(embed=em)
         else:
             em = await Embeds.is_married(member)
             await ctx.send(embed=em)
     else:
         em = await Embeds.is_not_married(member)
         await ctx.send(embed=em)
예제 #7
0
    async def rank(self, ctx, user: discord.Member = None):
        if user is None:
            user = ctx.message.author

        userY = UserDB.get_one(user.id)
        guildY = GuildDB.get_one(ctx.message.guild.id)
        rankings = RankingsDB.get_user(userY, guildY)

        if not rankings:
            RankingsDB.create_ranking(userY, guildY)
            rankings = RankingsDB.get_user(user, guildY)

        rank = RankingsDB.get_rank(userY, guildY)

        em = discord.Embed()
        em.set_author(name=user.name, icon_url=user.avatar_url)
        em.add_field(name="**Rank**", value=f"{rank}", inline=False)
        em.add_field(name="**Level**", value=rankings["level"])
        em.add_field(name="**Progress**",
                     value="{} / {}".format(rankings['xp'], rankings['reach']))
        await ctx.send(embed=em)
예제 #8
0
    async def leaderboard(self, ctx):
        guildY = GuildDB.get_one(ctx.message.guild.id)
        scoreboard = RankingsDB.get_scoreboard(guildY)

        em = discord.Embed(description="ScoreBoard",
                           color=discord.Colour.magenta())

        x = 0
        for user in scoreboard:
            member = discord.utils.get(ctx.guild.members, id=int(user))
            userY = UserDB.get_one(user)
            member_ranking = RankingsDB.get_user(userY, guildY)
            if member is None:
                RankingsDB.reset_user(userY, guildY)
            else:
                x += 1
                level = member_ranking['level']
                total = member_ranking['total']
                em.add_field(name=f"**{x} - {member.name}**",
                             value=f"Level : {level} \nTotal xp : {total}",
                             inline=False)

        await ctx.send(embed=em)
예제 #9
0
    async def unmute(self, ctx, user: discord.Member, auto: bool = False):

        if not auto:
            mod = ctx.message.author
        else:
            mod = "auto"

        role = discord.utils.get(ctx.guild.roles, name="Muted")
        guild = ctx.message.guild
        guildY = GuildDB.get_one(guild.id)
        userY = UserDB.get_one(user.id)

        if not MuteDB.is_muted(userY, guildY) or not role:
            return

        MuteDB.unset_mute(userY, guildY)

        try:
            await user.remove_roles(role)
        except discord.HTTPException:
            return

        em = await Embeds().format_mod_embed(ctx, user, mod, None, 'unmute')
        await self.log_send(ctx, ctx.message.guild.id, em)
예제 #10
0
 async def remove(self, ctx, id: int):
     await ctx.message.delete()
     user = UserDB.get_one(id)
     UserDB.unset_vip(id)
     await ctx.send(f"{id} has been remove from VIP")
예제 #11
0
    async def add(self, ctx, id: int):
        await ctx.message.delete()
        user = UserDB.get_one(id)
        UserDB.set_vip(id)

        await ctx.send(f"{id} is now VIP")
예제 #12
0
async def is_vip_check(ctx):
    vips = UserDB.get_vips()
    if str(ctx.message.author.id) in vips:
        return True
    else:
        return False
예제 #13
0
    async def on_message(self, message: discord.Message):
        """

        :param message: The message that has been sent
        """
        user = message.author

        if user.bot is True or message.guild is None:
            return

        if message.guild.id == '264445053596991498':
            return

        bucket = self._cd.get_bucket(message)
        retry_after = bucket.update_rate_limit()
        if retry_after:
            return

        userY = UserDB.get_one(user.id)
        guildY = GuildDB.get_one(message.guild.id)
        rankings = RankingsDB.get_user(userY, guildY)

        if not rankings:
            RankingsDB.create_ranking(userY, guildY)
            rankings = RankingsDB.get_user(userY, guildY)

        if rankings['level'] < 3:
            gain = randint(2, 12)
        elif 3 <= rankings['level'] < 6:
            gain = randint(8, 20)
        elif 6 <= rankings['level'] < 10:
            gain = randint(12, 20)
        elif 10 <= rankings['level'] < 20:
            gain = randint(12, 22)
        else:
            gain = randint(15, 25)

        rankings['xp'] += gain
        rankings['total'] += gain

        if rankings['xp'] >= rankings['reach']:
            rankings['level'] += 1
            if rankings["level"] > 39:
                rankings['reach'] = round(rankings['reach'] * 1.02)
            if 39 >= rankings["level"] > 21:
                rankings['reach'] = round(rankings['reach'] * 1.05)
            elif 21 >= rankings["level"] > 10:
                rankings['reach'] = round(rankings['reach'] * 1.1)
            elif 10 >= rankings["level"] > 6:
                rankings['reach'] = round(rankings['reach'] * 1.3)
            else:
                rankings['reach'] = round(rankings['reach'] * 1.6)
            rankings['xp'] = 0

            try:
                await message.channel.send("{} is now level {}.".format(
                    user.name, rankings['level']),
                                           delete_after=2)
            except discord.HTTPException:
                pass
            RankingsDB.update_user(userY, guildY, rankings)
            row = RoleDB.get_one_from_level(rankings['level'], guildY)
            if row:
                try:
                    role = discord.utils.get(message.guild.roles,
                                             id=int(row["role_id"]))
                    await user.add_roles(role)
                except discord.HTTPException:
                    pass

        RankingsDB.update_user(userY, guildY, rankings)
예제 #14
0
    async def mute(self,
                   ctx,
                   user: discord.Member,
                   duration: str,
                   *,
                   reason: ModReason = None):
        """
        :param ctx: Command context
        :param user: The member to mute
        :param duration: The duration of the mute
        :param reason: the reason of the mute
        """

        perm = await Check().check(ctx, user)
        if perm is False:
            return

        guild = ctx.message.guild
        guildY = GuildDB.get_one(guild.id)
        userY = UserDB.get_one(user.id)

        unit = duration[-1]
        if unit == 's':
            time = int(duration[:-1])
        elif unit == 'm':
            time = int(duration[:-1]) * 60
        elif unit == 'h':
            time = int(duration[:-1]) * 3600
        elif unit == 'd':
            time = int(duration[:-1]) * 86400
        else:
            return await ctx.send('Invalid Unit! Use `s`, `m`, `h` or `d`.')

        if MuteDB.is_muted(userY, guildY):
            return await ctx.send('This user is already muted, you should '
                                  'unmute him first.')

        role = discord.utils.get(ctx.guild.roles, name="Muted")
        if not role:
            role = await ctx.guild.create_role(
                name="Muted",
                permissions=discord.Permissions.none(),
                reason="Mute Role")
            for chan in ctx.guild.text_channels:
                await chan.set_permissions(role, send_messages=False)
        await user.add_roles(role)

        MuteDB.set_mute(userY, guildY)

        id = await SanctionMethod().create_sanction(user, 'Mute',
                                                    ctx.message.author, guild,
                                                    reason, time)
        em = await Embeds().format_mod_embed(ctx, user, ctx.message.author,
                                             reason, 'mute', id, duration)

        await self.log_send(ctx, ctx.message.guild.id, em)

        await asyncio.sleep(time)

        if MuteDB.is_muted(userY, guildY):
            await ctx.invoke(self.unmute, user, True)
예제 #15
0
 async def on_user_update(self, before, after):
     if before.name != after.name:
         name = "{}#{}".format(after.name.lower(), after.discriminator)
         UserDB.update_name(after.id, name)