Задать вопрос
nosemka
@nosemka
Middle Python Developer

Как сделать tasks.loop автоматического разбана после истечения времени, используя SQLITE3?

Не могу сделать функцию для того чтобы по истечению времени пользователя разбанивало.
Данные хранятся в базе данных SQLite3, дата бана в формате 21-11-2021
Вставил код кмд бана, библиотеки, sqlite3, tasks разбана.
Вот код:
import discord
from discord import *
from discord.ext import commands, tasks
from discord.ext.commands import Bot
from discord_components import DiscordComponents, Button, ButtonStyle
import sqlite3
import threading
from datetime import datetime
from datetime import date
from datetime import timedelta
import time

# DataBase
db = sqlite3.connect('baza.db', check_same_thread=False)
sql = db.cursor()
sql.execute(f"SELECT * FROM settings")
if sql.fetchone() is None:
	sql.execute(f"INSERT INTO settings VALUES ('.')")
	db.commit()
else:
	pass

# Configs
for settings in sql.execute(f"SELECT * FROM settings"):
	PREFIX = settings[0]
lock = threading.Lock()
intents = discord.Intents().all()
client = commands.Bot(command_prefix=PREFIX,intents=intents)
sql.execute(f"SELECT * FROM bans")
getallbannedid = []
for getallbid in sql.execute(f"SELECT * FROM bans"):
	getallbannedid += [getallbid[0]]
print(getallbannedid)

# Евенты
@client.event
async def on_ready():
	DiscordComponents(client)
	print("Бот запущен!")
	ban_loop.start()
	await client.change_presence(status = discord.Status.online, activity = discord.Game('by semmy#0068'))
# команды
@client.command(pass_context=True)
async def ban(ctx, member: discord.Member, daysss, reason, daysdelmsg):
	for info in sql.execute(f"SELECT * FROM users WHERE id = {ctx.author.id}"):
		accessquery = 3
		if info[1] >= accessquery:
			currenttime = datetime.now()
			getuserid = member.id
			emb = discord.Embed(description = f'**Блокировка аккаунта**', colour = discord.Color.red())
			emb.add_field(name = '**Пользователь**', value = f"<@!{member.id}>")
			emb.add_field(name = '**Причина**', value = f"{reason}")
			emb.add_field(name = '**Длительность**', value = f"{daysss} дней")
			emb.add_field(name = '**Дата выдачи**', value = f"{currenttime}")
			emb.add_field(name = '**Модератор**', value = f"<@!{ctx.author.id}>")
			emb.set_footer(text="© FakePixel Administraion")
			emb.set_author(name=client.user.name, icon_url=client.user.avatar_url)

			global getuserbannedid
			getuserbannedid = member.id

			sql.execute(f"SELECT banned FROM bans WHERE banned = {getuserid}")
			if sql.fetchone() is None:
				getnowdata = datetime.now().date()
				dayss = getnowdata + timedelta(days=int(daysss))
				sql.execute(f"INSERT INTO bans VALUES ({member.id}, {ctx.author.id}, '{dayss}', '{reason}', '{currenttime}')")
				db.commit()
			else:
				sql.execute(f"INSERT INTO bans VALUES ({member.id}, {ctx.author.id}, '{dayss}', '{reason}', '{currenttime}')")
				db.commit()

			await member.ban(delete_message_days=daysdelmsg)
			await ctx.send(embed=emb)

@tasks.loop(seconds=2.0)
async def ban_loop():
	await client.wait_until_ready()
	for bans in sql.execute(f"SELECT * FROM bans"):
		getdatanow = datetime.now().date()
		await client.wait_until_ready()
		if str(getdatanow) > bans[2]:
			guild = client.get_guild(806633419865718784)
			await guild.unban(getallbannedid[4])
			print(getallbannedid[4])
			sql.execute(f"DELETE FROM bans WHERE banned = {bans[0]}")
			db.commit()
			print('Пользователь разбанен по истечению длительности наказания')


как выглядит база:
Таблица: bans
619a98c4620fa302043049.png

Таблица: users (мб пригодится)
619a98f08e915294207688.png

Прошу помогите, функция автоматического разбана после истечения срока бана.
  • Вопрос задан
  • 577 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
зачем вызов await client.wait_until_ready() в цикле for bans в функции ban_loop()? Это затормозит цикл чёрт знает насколько. Аналогично с вызовом того же в начале ban_loop() - у тебя же есть обработчик on_ready(), ты запускаешь ban_loop() там, это гарантирует, что цикл начнётся когда бот уже готов работать.

Далее, зачем выбирать все баны и пролистывать их, когда можно настроить SELECT чтобы он выбирал только истёкшие баны?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 80 000 до 120 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽