Я создаю несогласованного бота в python, но у меня возникают проблемы с использованием задания l oop: удаление бота после нескольких циклов без какого-либо конкретного события.
client = discord.Client()
@tasks.loop(seconds=120)
async def checking_game():
await client.wait_until_ready()
try:
if checking_game.current_loop==0:
await asyncio.sleep(15)
date_actual = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print("{} : Initializing...".format(date_actual))
count_league=0
list_leagues = dbconnect.get_list_leagues_parsed(DB_local)
for league in list_leagues:
count_league = count_league+1
matchs_in_DB = new_matchs = 0
skiprange=0
list_games = list_games_parsed = []
league_id = league[0]
league_name = league[1]
finish = False
while finish == False:
c, conn = dbconnect.connection(DB_local)
c.execute("SELECT match_id, 1_is_parsed FROM games_acquired WHERE league_id = (%s)", (league_id,))
resultset = c.fetchall()
#if resultset != None:
for result in resultset:
list_games.append(result[0])
if result[1]==1:
list_games_parsed.append(result[0])
url = 'https://api.stratz.com/api/v1/league/' + str(league_id) + '/matches?&take=250' + '&skip=' + str(skiprange)
jsonleague = utilitary.JSONRequester(url)
for match in jsonleague:
match_id = match['id']
if match_id in list_games:
matchs_in_DB = matchs_in_DB+1
continue
else :
new_matchs = new_matchs+1
date_update = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
parsed = avoid = count_records = 0
insert = ("INSERT into games_acquired (match_id, league_id, date, 1_is_parsed, 1_is_avoid, count_records)""VALUES (%s, %s, %s, %s, %s, %s)")
data = (match_id, league_id, date_update, parsed, avoid, count_records)
dbconnect.insertToTable(DB_local, insert, data)
#print("{} added to DB.".format(match_id))
if match_id in list_games_parsed:
#print("{} allready parsed.".format(match_id))
continue
else:
functions.check_game_ready_opendota(match_id)
#print("parsing {}".format(match_id))
#functions.parser_game(DB_ftv, DB_local, match_id)
print("creating img PG {}".format(match_id))
urlOpendota = "https://api.opendota.com/api/matches/"+str(match_id)
jsonTeamOpendota =utilitary.JSONRequester(urlOpendota)
success, image_post_game = image_generator.generate_post_game(jsonTeamOpendota, match_id)
logging.info(f"Send new postmatch Image {match_id}")
c, conn = dbconnect.connection(DB_local)
c.execute("UPDATE games_acquired SET 1_is_parsed = 1 WHERE match_id = (%s)", (match_id,))
if success ==1:
try:
#print("send img")
await insa_chan.send(file=discord.File(image_post_game))
except Exception as e:
print(e)
print("{} allready in DB | {} new matchs added".format(matchs_in_DB, new_matchs))
if len(jsonleague) == 250:
skiprange = skiprange +250
else:
#print(f'{league_name} completly added ({count_league}/{len(setup.list_leagues)}) !')
finish = True
date_actual = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print("{} : Loop finished : {} tickets checked".format(date_actual, len(list_leagues)))
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
print(exc_type, fname, exc_tb.tb_lineno)
Задача l oop проверьте результат из API и, если есть новый результат, создайте изображение с этой новой статистикой, а затем это изображение будет опубликовано в виде файла в канале разногласий. Функция, вызываемая для создания образа, в порядке и не отвечает на проблемы.
Остальная часть кода:
@client.event
async def on_ready():
for guild in client.guilds:
if guild.name == setup.GUILD:
break
print(
f'{client.user} is connected to the following guild:\n'
f'{guild.name}(id: {guild.id})')
logging.info(setup.GUILD)
global insa_chan
insa_chan = discord.utils.get(client.get_all_channels(), guild__name=setup.GUILD, name=insalan_channel)
global general_chan
general_chan = discord.utils.get(client.get_all_channels(), guild__name=setup.GUILD, name=general_channel)
#print(f'{admin_chan.name}(id: {admin_chan.id})')
checking_game.start()
@client.event
async def on_message(message):
try:
if not message.author.id == bot_id and type(message.channel) == discord.channel.DMChannel:
check_auth(message)
chan = message.channel
command = '!game'
ms = str(str.lower(message.content))
if ms.startswith(command):
print(ms)
game_id = ms[len(command):]
game_id = game_id.replace(' ','')
print(game_id)
try:
game_id = int(game_id)
except:
await chan.send("Oups! Je n'ai pas réussi à synthétiser cette game : {}. \n Erreur dans l'ID".format(str(game_id)))
return
print(game_id)
ask_urlOpendota = "https://api.opendota.com/api/matches/"+str(game_id)
ask_jsonTeamOpendota =utilitary.JSONRequester(ask_urlOpendota)
success, ask_image_post_game = image_generator.generate_post_game(ask_jsonTeamOpendota, game_id)
if success==1:
#print('printing message to {} : {}'.format(message.author.name, message.content))
#await general_chan.send(message.content)
await chan.send(file=discord.File(ask_image_post_game))
else:
await chan.send("Oups! Je n'ai pas réussi à synthétiser cette game : {}".format(str(game_id)))
except Exception as e:
print('Error in on_message: {}'.format(e))
if __name__ == "__main__":
try:
client.run(TOKEN)
except Exception as e:
print('Error in __main__: {}'.format(e))
Я видел какое-то руководство по client.loop.create_task(checking_game())
, но я получая ошибку «Объект L oop не может быть вызван»
Также задача l oop «cheking_game» начинает выполняться перед подключением бота, если я не напишу это:
if checking_game.current_loop==0:
await asyncio.sleep(15)
функция client.wait_until_ready()
, кажется, не имеет никакого эффекта.
Может кто-нибудь показать мне, где я неправ, и помочь мне это исправить?
Спасибо за чтение! Если вам нужна дополнительная информация о коде или использовании, скажите мне
РЕДАКТИРОВАТЬ: у меня это журнала ошибок при его завершении:
2020-03-08 23:39:16,440 discord.gateway WARNING Heartbeat blocked for more than 5 seconds.
2020-03-08 23:41:41,900 discord.client INFO Cleaning up tasks.
2020-03-08 23:41:41,901 discord.client INFO Cleaning up after 2 tasks.
2020-03-08 23:41:41,901 discord.client INFO All tasks finished cancelling.
2020-03-08 23:41:41,902 discord.client INFO Closing the event loop.