Программа игнорирует команды по отключению бота Discord.Python

Программы на Python
Anonymous
Программа игнорирует команды по отключению бота Discord.

Сообщение Anonymous »

Я пытаюсь создать программу, которая при прекращении получения определенных запросов запускает бота и останавливает его при восстановлении соединения. Но как бы я ни старался, бот игнорирует команду на отключение бота, как будто не видит ее, будь то обычная строка await bot.close() или целая асинхронная функция. При этом код не выдает никакой ошибки, а тупо продолжает работать дальше. Помогите, пожалуйста, решить проблему.
Я пробовал следующие методы: команду await But.close() и то же самое, только в функции. При этом код не выдает никакой ошибки. Стоп-код бота начинает работать только после завершения самого кода
import socket
import threading
import time
import discord
import re
import os
import json
import random
import requests
import asyncio
import string
import signal

from discord.ext import commands

last_request_time = time.time()
bot_running = False

with open('config_test.json', 'r') as file:
config = json.load(file)

bot = commands.Bot(command_prefix=config['prefix'], intents=discord.Intents.all())
bot.remove_command('help')
@bot.event
async def on_ready():
await bot.change_presence(status=discord.Status.dnd, activity=discord.Game("❗❗❗ Emergency mode ❗❗❗"))
print(f'Bot is ready ✅. Logged in as {bot.user.name}')

@bot.event
async def on_message(message):
if message.author == bot.user:
return

if message.content.startswith(config['prefix']):
status = discord.Embed(
description=f"**Emergency mode ❌**",
color=discord.Color.red()
)
await message.channel.send(embed=status)
await bot.process_commands(message)

async def async_handle_client(conn, addr):
global last_request_time, bot_running
print(f'Connected: {addr}')
try:
conn.settimeout(30)
data = conn.recv(1024)
if data.decode('utf-8') == '240':
print('Request code 240 successfully')
if bot_running == True:
await bot.close()
print('Stop bot')
bot_running = False
last_request_time = time.time()
else:
print('The request was accepted, but the code does not match')
except socket.timeout:
print('Not request')
finally:
conn.close()

def handle_client(conn, addr):
asyncio.run(async_handle_client(conn, addr))

def start_server():
host = '0.0.0.0'
port = 240

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((host, port))
s.listen()
print(f'Server open {host}:{port}')

while True:
conn, addr = s.accept()
client_thread = threading.Thread(target=handle_client, args=(conn, addr))
client_thread.start()

async def monitor_requests():
global last_request_time, bot_running
while True:
if time.time() - last_request_time > 30:
print('No request, start Emergency mode!!!')
if bot_running == False:
await bot.start(config['token'])
bot_running = True
last_request_time = time.time()
await asyncio.sleep(1)

def shutdown(signal, frame):
print(f"A {signal} signal has been received, shutting down...")
asyncio.get_event_loop().create_task(bot.close())

def shutdown2(signal, frame):
asyncio.get_event_loop().create_task(bot.close())

async def stop_bot():
await bot.close()
print("Бот остановлен.")

if __name__ == '__main__':
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)

signal.signal(signal.SIGINT, shutdown)
signal.signal(signal.SIGTERM, shutdown)

server_thread = threading.Thread(target=start_server)
server_thread.start()

try:
loop.run_until_complete(monitor_requests())
finally:
loop.run_until_complete(loop.shutdown_asyncgens())
loop.close()


Подробнее здесь: https://stackoverflow.com/questions/787 ... iscord-bot

Вернуться в «Python»