Exemple #1
0
    async def balance(self, ctx, *, member_s=None):
        if member_s is None:
            member = ctx.author
        else:
            member = detect.member(ctx.guild, member_s)

        if member is None:
            reply = discord.Embed(
                title="💢 Упс",
                description=
                f"Вы указали {member_s}, подразумевая участника, но он не был найден",
                color=col("dr"))
            reply.set_footer(text=f"{ctx.author}",
                             icon_url=f"{ctx.author.avatar_url}")
            await ctx.send(embed=reply)

        else:
            collection = db["tokens"]
            result = collection.find_one(
                {
                    "_id": ctx.guild.id,
                    f"members.{member.id}": {
                        "$exists": True
                    }
                },
                projection={f"members.{member.id}": True})
            amount = get_field(result, "members", f"{member.id}")
            if amount is None:
                amount = 0

            reply = discord.Embed(title=f"Баланс {member}",
                                  description=f"**{amount}** 💰",
                                  color=member.color)
            reply.set_thumbnail(url=f"{member.avatar_url}")
            await ctx.send(embed=reply)
Exemple #2
0
    async def unmute(self, ctx, member_s):
        if not has_permissions(ctx.author, ["manage_messages"]):
            reply = discord.Embed(title="❌ Недостаточно прав",
                                  description=("**Необходимые права:**\n"
                                               "> Управлять сообщениями"),
                                  color=col("dr"))
            reply.set_footer(text=f"{ctx.author}",
                             icon_url=f"{ctx.author.avatar_url}")
            await ctx.send(embed=reply)

        else:
            member = detect.member(ctx.guild, member_s)

            if member == None:
                reply = discord.Embed(
                    title="💢 Упс",
                    description=
                    f"Вы указали {member_s}, подразумевая участника, но он не был найден",
                    color=col("dr"))
                reply.set_footer(text=f"{ctx.author}",
                                 icon_url=f"{ctx.author.avatar_url}")
                await ctx.send(embed=reply)

            elif ctx.author.top_role.position <= member.top_role.position and ctx.author.id != ctx.guild.owner_id:
                reply = discord.Embed(
                    title="💢 Позиция",
                    description=f"Ваша наивысшая роль не выше роли {member}",
                    color=col("dr"))
                reply.set_footer(text=f"{ctx.author}",
                                 icon_url=f"{ctx.author.avatar_url}")
                await ctx.send(embed=reply)

            elif ctx.guild.me.top_role.position <= member.top_role.position:
                reply = discord.Embed(
                    title="⚠ У меня нет прав",
                    description=(
                        f"Моя наивысшая роль не выше роли {member}\n"
                        "Чтобы исправить это, перетащите мою роль выше"),
                    color=col("dr"))
                reply.set_footer(text=f"{ctx.author}",
                                 icon_url=f"{ctx.author.avatar_url}")
                await ctx.send(embed=reply)

            elif mute_role_name not in [r.name for r in member.roles]:
                reply = discord.Embed(
                    title="💢 Ошибка",
                    description=f"На участника {member_s} не наложен мут",
                    color=col("dr"))
                reply.set_footer(text=f"{ctx.author}",
                                 icon_url=f"{ctx.author.avatar_url}")
                await ctx.send(embed=reply)

            else:
                log = await withdraw.mute(member, sec=0)
                await post_log(ctx.guild, log)
                await ctx.send(embed=log, delete_after=3)
                await ctx.message.delete()
Exemple #3
0
    async def kick(self, ctx, member_s, *, reason="не указана"):
        member = detect.member(ctx.guild, member_s)

        if not has_permissions(ctx.author, ["kick_members"]):
            reply = discord.Embed(title="❌ Недостаточно прав",
                                  description=("**Необходимые права:**\n"
                                               "> Кикать участников"),
                                  color=col("dr"))
            reply.set_footer(text=f"{ctx.author}",
                             icon_url=f"{ctx.author.avatar_url}")
            await ctx.send(embed=reply)

        elif member == None:
            reply = discord.Embed(
                title="💢 Упс",
                description=
                f"Вы указали {member_s}, подразумевая участника, но он не был найден",
                color=col("dr"))
            reply.set_footer(text=f"{ctx.author}",
                             icon_url=f"{ctx.author.avatar_url}")
            await ctx.send(embed=reply)

        elif member.top_role.position >= ctx.author.top_role.position and ctx.author.id != ctx.guild.owner_id:
            reply = discord.Embed(
                title="💢 Позиция",
                description=f"Ваша наивысшая роль не выше роли {member}",
                color=col("dr"))
            reply.set_footer(text=f"{ctx.author}",
                             icon_url=f"{ctx.author.avatar_url}")
            await ctx.send(embed=reply)

        elif ctx.guild.me.top_role.position <= member.top_role.position:
            reply = discord.Embed(
                title="⚠ У меня нет прав",
                description=(f"Моя наивысшая роль не выше, чем роль {member}\n"
                             "Чтобы исправить это, перетащите мою роль выше"),
                color=discord.Color.dark_gold())
            reply.set_footer(text=f"{ctx.author}",
                             icon_url=f"{ctx.author.avatar_url}")
            await ctx.send(embed=reply)

        else:
            log_emb = discord.Embed(
                title="⚖ Участник исключён",
                description=(f"**Участник:** {member}\n"
                             f"**Модератор:** {ctx.author}\n"
                             f"**Причина:** {reason}"),
                color=col(50, 50, 50))

            await ctx.guild.kick(member, reason=reason)
            await post_log(ctx.guild, log_emb)
            await ctx.send(embed=log_emb, delete_after=3)
            await ctx.message.delete()
Exemple #4
0
    async def warns(self, ctx, *, member_s=None):
        if member_s == None:
            member = ctx.author
        else:
            member = detect.member(ctx.guild, member_s)

        if member is None:
            reply = discord.Embed(
                title="💢 Упс",
                description=
                f"Вы указали {member_s}, подразумевая участника, но он не был найден",
                color=col("dr"))
            reply.set_footer(text=f"{ctx.author}",
                             icon_url=f"{ctx.author.avatar_url}")
            await ctx.send(embed=reply)

        else:
            collection = db["warns"]
            result = collection.find_one(
                {
                    "_id": ctx.guild.id,
                    f"{member.id}": {
                        "$exists": True
                    }
                },
                projection={f"{member.id}": True})

            member_warns = get_field(result, f"{member.id}")
            if member_warns is None:
                desc = "Отсутствуют"
                member_warns = []
            else:
                desc = ""

            reply = discord.Embed(title=f"📚 Предупреждения {member}",
                                  description=desc,
                                  color=col("o"))
            reply.set_thumbnail(url=f"{member.avatar_url}")
            for i in range(len(member_warns)):
                w = member_warns[i]
                dt = f"{w['timestamp']}"[:-10].replace("-", ".")
                mod = ctx.guild.get_member(w['mod_id'])

                reply.add_field(name=f"🔸 **{i+1}**",
                                value=(f"**Модератор:** {mod}\n"
                                       f"**Причина:** {w['reason']}\n"
                                       f"**Дата и время:** `{dt}` (UTC)\n"),
                                inline=False)

            await ctx.send(embed=reply)
Exemple #5
0
    async def unwarn(self, ctx, member_s, number):
        p = ctx.prefix
        number = number.lower()
        if not has_permissions(ctx.author, ["ban_members"]):
            reply = discord.Embed(title="❌ Недостаточно прав",
                                  description=("**Необходимые права:**\n"
                                               f"> Банить участников"),
                                  color=col("dr"))
            reply.set_footer(text=f"{ctx.author}",
                             icon_url=f"{ctx.author.avatar_url}")
            await ctx.send(embed=reply)

        else:
            member = detect.member(ctx.guild, member_s)
            if member is None:
                reply = discord.Embed(
                    title="💢 Упс",
                    description=
                    f"Вы указали {member_s}, подразумевая участника, но он не был найден",
                    color=col("dr"))
                reply.set_footer(text=f"{ctx.author}",
                                 icon_url=f"{ctx.author.avatar_url}")
                await ctx.send(embed=reply)

            elif number != "all" and not number.isdigit():
                reply = discord.Embed(
                    title="💢 Ошибка",
                    description=
                    (f"Номер варна должен быть целым числом или параметром `all`. Введено: {number}\n"
                     f"Подробнее: `{p}unwarn`"),
                    color=col("dr"))
                reply.set_footer(text=f"{ctx.author}",
                                 icon_url=f"{ctx.author.avatar_url}")
                await ctx.send(embed=reply)
            else:
                collection = db["warns"]
                desc = None
                if number == "all":
                    collection.find_one_and_update(
                        {
                            "_id": ctx.guild.id,
                            f"{member.id}": {
                                "$exists": True
                            }
                        }, {"$unset": {
                            f"{member.id}": ""
                        }})
                    desc = (f"**Участник:** {member}\n"
                            f"**Модератор:** {ctx.author}\n"
                            f"**Все предупреждения** сняты")
                else:
                    number = int(number)
                    result = collection.find_one(
                        {
                            "_id": ctx.guild.id,
                            f"{member.id}": {
                                "$exists": True
                            }
                        },
                        projection={f"{member.id}": True})
                    member_warns = get_field(result, f"{member.id}")

                    if member_warns is None or member_warns == []:
                        error_desc = f"У участника {member} нет предупреждений"
                    elif len(member_warns) < number or number < 1:
                        error_desc = f"Варн не найден. Всего варнов: {len(member_warns)}"
                    else:
                        member_warns.pop(number - 1)
                        collection.find_one_and_update(
                            {
                                "_id": ctx.guild.id,
                                f"{member.id}": {
                                    "$exists": True
                                }
                            }, {"$set": {
                                f"{member.id}": member_warns
                            }})
                        desc = (f"**Участник:** {member}\n"
                                f"**Модератор:** {ctx.author}\n"
                                f"**Номер:** {number}")

                if desc is None:
                    reply = discord.Embed(title="💢 Ошибка",
                                          description=error_desc)
                    reply.set_footer(text=f"{ctx.author}",
                                     icon_url=f"{ctx.author.avatar_url}")
                    await ctx.send(embed=reply)

                else:
                    log_emb = discord.Embed(title="♻ Сняты предупреждения",
                                            description=desc,
                                            color=col("dg"))
                    log_emb.set_footer(text=f"{ctx.author}",
                                       icon_url=f"{ctx.author.avatar_url}")
                    await ctx.send(embed=log_emb, delete_after=3)
                    await post_log(ctx.guild, log_emb)
                    await ctx.message.delete()
Exemple #6
0
    async def warn(self, ctx, member_s, *, reason="не указана"):
        if not has_permissions(ctx.author, ["ban_members"]):
            reply = discord.Embed(title="❌ Недостаточно прав",
                                  description=("**Необходимые права:**\n"
                                               f"> Банить участников"),
                                  color=col("dr"))
            reply.set_footer(text=f"{ctx.author}",
                             icon_url=f"{ctx.author.avatar_url}")
            await ctx.send(embed=reply)

        else:
            member = detect.member(ctx.guild, member_s)
            if member is None:
                reply = discord.Embed(
                    title="💢 Упс",
                    description=
                    f"Вы указали {member_s}, подразумевая участника, но он не был найден",
                    color=col("dr"))
                reply.set_footer(text=f"{ctx.author}",
                                 icon_url=f"{ctx.author.avatar_url}")
                await ctx.send(embed=reply)

            elif member.top_role.position >= ctx.author.top_role.position and ctx.author.id != ctx.guild.owner_id:
                reply = discord.Embed(
                    title="💢 Упс",
                    description="Роль этого участника не ниже Вашей",
                    color=col("dr"))
                reply.set_footer(text=f"{ctx.author}",
                                 icon_url=f"{ctx.author.avatar_url}")
                await ctx.send(embed=reply)

            else:
                collection = db["warns"]

                result = collection.find_one({
                    "_id": ctx.guild.id,
                    f"{member.id}": {
                        "$exists": True
                    }
                })
                member_warns = get_field(result, f"{member.id}")
                if member_warns is None:
                    total_warns = 0
                else:
                    total_warns = len(member_warns)

                if total_warns >= 5:
                    reply = discord.Embed(
                        title="💢 Лимит",
                        description=
                        "У участника не может быть больше **5** предупреждений",
                        color=col("dr"))
                    reply.set_footer(text=f"{ctx.author}",
                                     icon_url=f"{ctx.author.avatar_url}")
                    await ctx.send(embed=reply)

                elif total_warns >= 4:
                    sec = 24 * 3600
                    log_emb = discord.Embed(
                        title="⛔ Пользователь временно забанен",
                        description=
                        (f"**Пользователь:** {member}\n"
                         f"**Модератор:** {ctx.author}\n"
                         f"**Длительность:** {visual_delta(datetime.timedelta(seconds=sec))}\n"
                         f"**Причина:** набрал 5 или более предупреждений"),
                        color=discord.Color.red())
                    await do_tempban(member, ctx.author, sec, reason)

                    await post_log(ctx.guild, log_emb)
                    await ctx.send(embed=log_emb, delete_after=3)
                    await ctx.message.delete()
                    await try_send(member, embed=log_emb)

                    log_emb = await withdraw_tempban(ctx.guild, member.id)
                    if log_emb != None:
                        await post_log(ctx.guild, log_emb)

                else:
                    warn_json = {
                        "mod_id": ctx.author.id,
                        "reason": reason,
                        "timestamp": datetime.datetime.utcnow()
                    }

                    collection.find_one_and_update(
                        {"_id": ctx.guild.id},
                        {"$addToSet": {
                            f"{member.id}": warn_json
                        }},
                        upsert=True)

                    warn_log = discord.Embed(
                        title="🔸 Предупреждение",
                        description=(f"**Участник:** {member}\n"
                                     f"**Модератор:** {ctx.author}\n"
                                     f"**Причина:** {reason}\n"),
                        color=col("o"))
                    await ctx.send(embed=warn_log, delete_after=3)
                    await post_log(ctx.guild, warn_log)
                    await ctx.message.delete()
                    await try_send(member, embed=warn_log)
Exemple #7
0
    async def change_tokens(self, ctx, amount, *, member_s=None):
        collection = db["tokens"]
        if member_s is None:
            member = ctx.author
        else:
            member = detect.member(ctx.guild, member_s)

        result = collection.find_one({"_id": ctx.guild.id},
                                     projection={"master_role": True})
        mr_id = get_field(result, "master_role")

        if not has_roles(ctx.author, [mr_id]):
            reply = discord.Embed(title="❌ Недостаточно прав",
                                  description=("**Необходимые права:**\n"
                                               "> Администратор\n"
                                               "или\n"
                                               "> Роль переводчика токенов"),
                                  color=col("dr"))
            reply.set_footer(text=f"{ctx.author}",
                             icon_url=f"{ctx.author.avatar_url}")
            await ctx.send(embed=reply)

        elif member is None:
            reply = discord.Embed(
                title="💢 Упс",
                description=
                f"Вы указали {member_s}, подразумевая участника, но он не был найден",
                color=col("dr"))
            reply.set_footer(text=f"{ctx.author}",
                             icon_url=f"{ctx.author.avatar_url}")
            await ctx.send(embed=reply)

        elif try_int(amount) is None:
            reply = discord.Embed(
                title="💢 Упс",
                description=
                f"Аргумент \"{amount}\" должен быть целым числом, как `5` или `-5`",
                color=col("dr"))
            reply.set_footer(text=f"{ctx.author}",
                             icon_url=f"{ctx.author.avatar_url}")
            await ctx.send(embed=reply)

        else:
            amount = int(amount)
            amount_desc = f"{amount}"
            if amount_desc[0] != "-":
                amount_desc = f"+{amount_desc}"

            collection.find_one_and_update(
                {"_id": ctx.guild.id},
                {"$inc": {
                    f"members.{member.id}": amount
                }},
                projection={
                    f"members.{member.id}": True,
                    "add": True,
                    "remove": True
                },
                upsert=True)
            reply = discord.Embed(
                title="♻ Выполнено",
                description=f"{amount_desc} 💰 участнику **{member}**",
                color=col("dg"))
            reply.set_footer(text=f"{ctx.author}",
                             icon_url=f"{ctx.author.avatar_url}")
            await ctx.send(embed=reply)

            await process_auto_roles(member)
Exemple #8
0
    async def mute(self, ctx, member_s, raw_dur, *, reason="не указана"):
        if not has_permissions(ctx.author, ["manage_messages"]):
            reply = discord.Embed(title="❌ Недостаточно прав",
                                  description=("**Требуемые права:**\n"
                                               "> Управлять сообщениями"),
                                  color=col("dr"))
            reply.set_footer(text=f"{ctx.author}",
                             icon_url=f"{ctx.author.avatar_url}")
            await ctx.send(embed=reply)

        else:
            member = detect.member(ctx.guild, member_s)
            if member == None:
                reply = discord.Embed(
                    title="💢 Упс",
                    description=
                    f"Вы указали {member_s}, подразумевая участника, но он не был найден",
                    color=col("dr"))
                reply.set_footer(text=f"{ctx.author}",
                                 icon_url=f"{ctx.author.avatar_url}")
                await ctx.send(embed=reply)

            else:
                t_code = raw_dur[-1:].lower()
                t_weight = raw_dur[:-1]
                if t_code not in time_codes or not t_weight.isdigit():
                    reply = discord.Embed(
                        title="💢 Неверный аргумент",
                        description=
                        ("Пожалуйста, укажите длительность в таком формате:\n"
                         "`5m` - 5 минут\n"
                         "`s - сек` `m - мин` `h - час` `d - сут` `w - нед`"),
                        color=col("dr"))
                    reply.set_footer(text=f"{ctx.author}",
                                     icon_url=f"{ctx.author.avatar_url}")
                    await ctx.send(embed=reply)

                elif mute_role_name in [r.name for r in member.roles]:
                    reply = discord.Embed(
                        title="💢 Ошибка",
                        description=f"Участник {member} уже ограничен",
                        color=col("dr"))
                    reply.set_footer(text=f"{ctx.author}",
                                     icon_url=f"{ctx.author.avatar_url}")
                    await ctx.send(embed=reply)

                elif ctx.author.top_role.position <= member.top_role.position and ctx.author.id != ctx.guild.owner_id:
                    reply = discord.Embed(
                        title="💢 Позиция",
                        description=
                        f"Ваша наивысшая роль не выше роли {member}",
                        color=col("dr"))
                    reply.set_footer(text=f"{ctx.author}",
                                     icon_url=f"{ctx.author.avatar_url}")
                    await ctx.send(embed=reply)

                elif ctx.guild.me.top_role.position <= member.top_role.position:
                    reply = discord.Embed(
                        title="⚠ У меня нет прав",
                        description=(
                            f"Моя наивысшая роль не выше, чем роль {member}\n"
                            "Чтобы исправить это, перетащите мою роль выше"),
                        color=discord.Color.dark_gold())
                    reply.set_footer(text=f"{ctx.author}",
                                     icon_url=f"{ctx.author.avatar_url}")
                    await ctx.send(embed=reply)

                else:
                    sec = int(t_weight) * time_codes[t_code]

                    delta = datetime.timedelta(seconds=sec)
                    if delta.days >= 14:
                        reply = discord.Embed(
                            title="💢 Превышен лимит",
                            description=
                            "Мут не может длиться дольше, чем 2 недели",
                            color=col("dr"))
                        reply.set_footer(text=f"{ctx.author}",
                                         icon_url=f"{ctx.author.avatar_url}")
                        await ctx.send(embed=reply)

                    else:
                        log_emb = discord.Embed(
                            title="🔒 Наложен мут",
                            description=
                            (f"**Участник:** {member}\n"
                             f"**Модератор:** {ctx.author}\n"
                             f"**Длительность:** {visual_delta(datetime.timedelta(seconds=sec))}\n"
                             f"**Причина:** {reason}"),
                            color=col("do"))
                        await do_action.mute(member, ctx.author, sec, reason)

                        await post_log(ctx.guild, log_emb)
                        await ctx.send(embed=log_emb, delete_after=3)
                        await ctx.message.delete()
                        await try_send(member, embed=log_emb)

                        log_emb = await withdraw.mute(member)
                        if log_emb != None:
                            await post_log(ctx.guild, log_emb)