5
5
import os
6
6
from datetime import datetime
7
7
from enum import Enum
8
+ import threading
8
9
from typing import Optional
9
10
10
11
import aiohttp
15
16
from discord .ext import tasks
16
17
from discord .ui import Button , Modal , Select , TextInput , View
17
18
from dotenv import load_dotenv
18
- from discordgsm .async_utils import to_chunks
19
+ from discordgsm .async_utils import run_in_new_loop , to_chunks
19
20
20
21
from discordgsm .environment import AdvertiseType , env
21
22
from discordgsm .gamedig import GamedigGame
@@ -67,8 +68,8 @@ async def on_ready():
67
68
await sync_commands (whitelist_guilds )
68
69
await tasks_fetch_messages ()
69
70
70
- if not tasks_query .is_running ():
71
- tasks_query .start ()
71
+ if not tasks_query_servers .is_running ():
72
+ tasks_query_servers .start ()
72
73
73
74
if not cache_guilds .is_running () and env ('WEB_API_ENABLE' ):
74
75
cache_guilds .start ()
@@ -927,9 +928,25 @@ def group_servers_by_message_id(servers: list[Server]) -> dict[int, list[Server]
927
928
928
929
929
930
# region Application tasks
931
+ _tasks_query_servers_thread : Optional [threading .Thread ] = None
932
+ exit_signal = threading .Event ()
933
+
934
+
930
935
@tasks .loop (seconds = max (15.0 , env ('TASK_QUERY_SERVER' )))
931
- async def tasks_query ():
936
+ async def tasks_query_servers ():
932
937
"""Query servers (Scheduled)"""
938
+ global _tasks_query_servers_thread
939
+
940
+ if _tasks_query_servers_thread is not None :
941
+ while _tasks_query_servers_thread .is_alive ():
942
+ await asyncio .sleep (1 )
943
+
944
+ if _tasks_query_servers_thread is None or not _tasks_query_servers_thread .is_alive ():
945
+ _tasks_query_servers_thread = threading .Thread (target = run_in_new_loop , args = (__tasks_query_servers , tasks_query_servers .current_loop ))
946
+ _tasks_query_servers_thread .start ()
947
+
948
+
949
+ async def __tasks_query_servers (current_loop : int ):
933
950
# Pre query servers, some servers cannot be queried one by one
934
951
games_servers_count = await database .count_servers_per_game ()
935
952
pre_query_tasks = [pre_query (protocol ({})) for name , protocol in protocols .items () if protocol .pre_query_required and games_servers_count .get (name , 0 ) > 0 ]
@@ -954,13 +971,17 @@ async def tasks_query():
954
971
Logger .info (f'Query servers: Total = { len (queried_servers )} , Success = { success } , Failed = { failed } ({ percent } % fail)' )
955
972
956
973
# Run the tasks after the server queries
957
- await asyncio .gather (tasks_send_alert (), tasks_edit_messages (), tasks_presence_update (tasks_query . current_loop ))
974
+ await asyncio .gather (tasks_send_alert (), tasks_edit_messages (), tasks_presence_update (current_loop ))
958
975
959
976
960
977
async def query_servers (distinct_servers : dict [tuple [str , str , int , str ], list [Server ]]):
961
- query_tasks = [query_distinct_server (servers ) for servers in distinct_servers .values ()]
978
+ query_tasks = [asyncio . create_task ( query_distinct_server (servers ) ) for servers in distinct_servers .values ()]
962
979
963
980
async for chunks in to_chunks (query_tasks , int (os .getenv ('TASK_QUERY_CHUNK_SIZE' , '50' ))):
981
+ if exit_signal .is_set ():
982
+ Logger .debug (f'Exit signal received. Terminating server queries.' )
983
+ break
984
+
964
985
await asyncio .gather (* chunks )
965
986
966
987
servers : list [Server ] = []
@@ -970,6 +991,7 @@ async def query_servers(distinct_servers: dict[tuple[str, str, int, str], list[S
970
991
971
992
return servers
972
993
994
+
973
995
async def query_distinct_server (servers : list [Server ]):
974
996
"""Query server"""
975
997
server = servers [0 ]
@@ -1120,6 +1142,10 @@ async def tasks_edit_messages():
1120
1142
1121
1143
# Discord Rate limit: 50 requests per second
1122
1144
async for chunks in to_chunks (tasks , 25 ):
1145
+ if exit_signal .is_set ():
1146
+ Logger .debug ('Exit signal received. Terminating message editing tasks.' )
1147
+ break
1148
+
1123
1149
start = datetime .now ().timestamp ()
1124
1150
results += await asyncio .gather (* chunks , return_exceptions = True )
1125
1151
time_used = datetime .now ().timestamp () - start
0 commit comments