Я пробовал следующие методы: команду 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("
print(f'Bot is ready
@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