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)
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()
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()
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)
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()
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)
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)
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)