0% acharam este documento útil (0 voto)
20 visualizações5 páginas

Gerenciamento de Advertências no Discord

O documento é um código Python para um bot do Discord que gerencia advertências e limitações de usuários em um servidor. Ele inclui funcionalidades para aplicar, reduzir e limpar advertências, além de aplicar e remover um cargo limitado. O bot utiliza um sistema de histórico de advertências e verifica periodicamente a expiração dessas advertências para ajustar os cargos dos usuários conforme necessário.
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato TXT, PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
20 visualizações5 páginas

Gerenciamento de Advertências no Discord

O documento é um código Python para um bot do Discord que gerencia advertências e limitações de usuários em um servidor. Ele inclui funcionalidades para aplicar, reduzir e limpar advertências, além de aplicar e remover um cargo limitado. O bot utiliza um sistema de histórico de advertências e verifica periodicamente a expiração dessas advertências para ajustar os cargos dos usuários conforme necessário.
Direitos autorais
© All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato TXT, PDF, TXT ou leia on-line no Scribd

import discord, pytz, json, os, re

from [Link] import commands, tasks


from discord import app_commands, Member
from datetime import datetime, timedelta

with open([Link]([Link]([Link](__file__)), '..',


'[Link]'), 'r', encoding='utf-8') as f:
cnfgs = [Link](f)

def parse_tempo(entrada: str) -> timedelta:


unidade = entrada[-1].lower()
valor = int(entrada[:-1])

if unidade == 's':
return timedelta(seconds=valor)
elif unidade == 'm':
return timedelta(minutes=valor)
elif unidade == 'h':
return timedelta(hours=valor)
elif unidade == 'd':
return timedelta(days=valor)
else:
raise ValueError(f"Unidade de tempo inválida: {entrada}. Use 's', 'm', 'h'
ou 'd'.")

CARGOS_PROGRESSIVOS = [cnfgs["Crg_Adv1"], cnfgs["Crg_Adv2"], cnfgs["Crg_Adv3"]]


CARGO_LIMITADO = cnfgs["Crg_Limitado"]

TEMPO_EXPIRACAO_CONFIG = "10s"
INTERVALO_VERIFICACAO_CONFIG = "10s"

TEMPO_EXPIRACAO = parse_tempo(TEMPO_EXPIRACAO_CONFIG)
INTERVALO_VERIFICACAO = parse_tempo(INTERVALO_VERIFICACAO_CONFIG)

def load_warn_history():
if [Link]('warn_history.json'):
with open('warn_history.json', 'r', encoding='utf-8') as f:
return [Link](f)
return {}

def save_warn_history(history):
with open('warn_history.json', 'w', encoding='utf-8') as f:
[Link](history, f, ensure_ascii=False, indent=4)

class Limitar([Link]):
def __init__(self, bot: [Link]):
[Link] = bot
self.verificar_expiracoes.start()

def cog_unload(self):
self.verificar_expiracoes.cancel()

@[Link](seconds=INTERVALO_VERIFICACAO.total_seconds())
async def verificar_expiracoes(self):
await [Link].wait_until_ready()
guild = [Link].get_guild(cnfgs["Server_ID"])
if not guild:
return
history = load_warn_history()
now = [Link]([Link]('America/Sao_Paulo'))

for user_id, warns in [Link]():


member = guild.get_member(int(user_id))
if not member:
continue

[Link](key=lambda x: x['date'])
expired_warns = [w for w in warns if now >=
[Link](w['date']) + TEMPO_EXPIRACAO]
if expired_warns:
idx = len(warns) - 1
if idx < len(CARGOS_PROGRESSIVOS):
cargo_id = CARGOS_PROGRESSIVOS[idx]
role = guild.get_role(cargo_id)
if role in [Link]:
await member.remove_roles(role)
if idx > 0:
await
member.add_roles(guild.get_role(CARGOS_PROGRESSIVOS[idx - 1]))
warns = warns[len(expired_warns):]
history[user_id] = warns

save_warn_history(history)

async def aplicar_advertencia(self, interaction: [Link], member:


[Link]):
history = load_warn_history()
user_id = str([Link])

if user_id not in history:


history[user_id] = []

advertencias_atuais = len(history[user_id])
if advertencias_atuais >= len(CARGOS_PROGRESSIVOS):
cargo_atual = [Link].get_role(CARGOS_PROGRESSIVOS[-1])
await member.add_roles(cargo_atual)
history[user_id].append({
"tipo": len(CARGOS_PROGRESSIVOS),
"date":
[Link]([Link]('America/Sao_Paulo')).isoformat()
})
else:
novo_cargo =
[Link].get_role(CARGOS_PROGRESSIVOS[advertencias_atuais])
await member.add_roles(novo_cargo)
if advertencias_atuais > 0:
cargo_antigo =
[Link].get_role(CARGOS_PROGRESSIVOS[advertencias_atuais - 1])
await member.remove_roles(cargo_antigo)
history[user_id].append({
"tipo": advertencias_atuais + 1,
"date":
[Link]([Link]('America/Sao_Paulo')).isoformat()
})

save_warn_history(history)
return novo_cargo.name
@app_commands.command(name="advertir", description="Gerencia advertências e
limitações de um usuário.")
@app_commands.describe(usuario="Usuário a ser afetado", acao="Ação desejada")
@app_commands.choices(
acao=[
app_commands.Choice(name="Aplicar Advertência", value="aplicar"),
app_commands.Choice(name="Reduzir Advertência", value="reduzir"),
app_commands.Choice(name="Limpar Advertências", value="limpar"),
app_commands.Choice(name="Aplicar Limitado", value="limitar"),
app_commands.Choice(name="Remover Limitado", value="remover_limite"),
]
)
@app_commands.guilds([Link](id=cnfgs["Server_ID"]))
async def advertir(self, interaction: [Link], usuario: Member,
acao: app_commands.Choice[str]):
valor_acao = [Link]

if valor_acao == "aplicar":
resultado = await self.aplicar_advertencia(interaction, usuario)
resposta = f"{[Link]} recebeu a advertência: **{resultado}**"
await [Link].send_message(resposta, ephemeral=True)

data_aplicacao = [Link]([Link]('America/Sao_Paulo'))
expiracao = data_aplicacao + TEMPO_EXPIRACAO

embed = [Link](
title="⚠️ Advertência Aplicada",
description=f"{[Link]} atribuiu **{resultado}** a
{[Link]}.",
color=[Link]()
)
embed.add_field(name="⏳ Expiração", value=[Link]("%d/%m/%Y
%H:%M:%S"), inline=False)

elif valor_acao == "reduzir":


history = load_warn_history()
user_id = str([Link])
if user_id in history and history[user_id]:
# Remove a última advertência
ultima = history[user_id].pop()

tipo_anterior = ultima["tipo"] - 1
if tipo_anterior > 0:
# Redefine o tempo da nova advertência
nova_data =
[Link]([Link]('America/Sao_Paulo')).isoformat()
history[user_id].append({
"tipo": tipo_anterior,
"date": nova_data
})

# Atualiza cargos
for cargo_id in CARGOS_PROGRESSIVOS:
role = [Link].get_role(cargo_id)
if role in [Link]:
await usuario.remove_roles(role)
if tipo_anterior > 0:
cargo_novo =
[Link].get_role(CARGOS_PROGRESSIVOS[tipo_anterior - 1])
await usuario.add_roles(cargo_novo)

save_warn_history(history)

await [Link].send_message(f"Uma advertência foi


reduzida de {[Link]}.", ephemeral=True)

embed = [Link](
title="⚠️ Advertência Reduzida",
description=f"{[Link]} reduziu uma
advertência de {[Link]}.",
color=[Link]()
)
embed.add_field(name="Advertências restantes",
value=str(len(history[user_id])), inline=False)
else:
await [Link].send_message(f"{[Link]} não
possui advertências para remover.", ephemeral=True)
return

elif valor_acao == "limpar":


history = load_warn_history()
user_id = str([Link])
if user_id in history:
del history[user_id]
save_warn_history(history)
await [Link].send_message(f"Todas as advertências de
{[Link]} foram limpas.", ephemeral=True)

for cargo_id in CARGOS_PROGRESSIVOS:


cargo = [Link].get_role(cargo_id)
if cargo in [Link]:
await usuario.remove_roles(cargo)

embed = [Link](
title="⚠️ Advertências Limpas",
description=f"{[Link]} limpou todas as
advertências de {[Link]}.",
color=[Link]()
)
else:
await [Link].send_message(f"{[Link]} não
possui advertências para limpar.", ephemeral=True)
return

elif valor_acao == "limitar":


role = [Link].get_role(CARGO_LIMITADO)
if role and role not in [Link]:
await usuario.add_roles(role)
await [Link].send_message(f"{[Link]} foi
marcado como 🚨 *limitado*.", ephemeral=True)

embed = [Link](
title="🚨 Limitado Aplicado",
description=f"{[Link]} aplicou o cargo
**{[Link]}** em {[Link]}.",
color=[Link]()
)
else:
await [Link].send_message(f"{[Link]} já
possui o cargo limitado ou ele não foi encontrado.", ephemeral=True)
return

elif valor_acao == "remover_limite":


role = [Link].get_role(CARGO_LIMITADO)
if role and role in [Link]:
await usuario.remove_roles(role)
await [Link].send_message(f"{[Link]} teve o
cargo 🚨 *limitado* removido.", ephemeral=True)

embed = [Link](
title="🚨 Limitado Removido",
description=f"{[Link]} removeu o cargo
**{[Link]}** de {[Link]}.",
color=[Link]()
)
else:
await [Link].send_message(f"{[Link]} não
possui o cargo limitado.", ephemeral=True)
return

else:
await [Link].send_message("Ação inválida. 🌀 Como
conseguiu isso?", ephemeral=True)
return

log_channel = [Link].get_channel(cnfgs["Cnl_Logs"])
if log_channel:
await log_channel.send(embed=embed)

async def setup(bot: [Link]):


await bot.add_cog(Limitar(bot))

Você também pode gostar