Archived
1
0
Fork 0
This repository has been archived on 2024-04-26. You can view files and clone it, but cannot push or open issues or pull requests.
akari-bot/core/queue.py

105 lines
4 KiB
Python
Raw Normal View History

2023-08-27 13:36:11 +00:00
import asyncio
2023-11-06 12:35:28 +00:00
from datetime import datetime
2023-08-29 13:04:36 +00:00
import traceback
2023-08-27 13:36:11 +00:00
import ujson as json
2023-11-06 12:35:28 +00:00
from core.builtins import Bot, Temp, MessageChain
2023-09-03 08:50:12 +00:00
from core.logger import Logger
2023-08-29 18:13:34 +00:00
from core.utils.info import get_all_clients_name
2023-08-30 09:49:45 +00:00
from core.utils.ip import append_ip, fetch_ip_info
2023-09-03 08:50:12 +00:00
from database import BotDBUtil
2023-08-27 13:36:11 +00:00
_queue_tasks = {}
class JobQueue:
@classmethod
async def add_job(cls, target_client: str, action, args, wait=True):
taskid = BotDBUtil.JobQueue.add(target_client, action, args)
if wait:
flag = asyncio.Event()
_queue_tasks[taskid] = {'flag': flag}
await flag.wait()
result = _queue_tasks[taskid]['result']
del _queue_tasks[taskid]
return result
else:
return taskid
@classmethod
async def validate_permission(cls, target_client: str, target_id: str, sender_id: str):
2023-08-27 14:58:53 +00:00
return (await cls.add_job(target_client, 'validate_permission',
{'target_id': target_id, 'sender_id': sender_id}))['value']
2023-08-27 13:36:11 +00:00
2023-08-29 17:43:00 +00:00
@classmethod
2023-08-29 18:13:34 +00:00
async def trigger_hook(cls, target_client: str, module_or_hook_name: str, **kwargs):
2023-08-29 17:43:00 +00:00
return await cls.add_job(target_client, 'trigger_hook',
2023-08-29 18:13:34 +00:00
{'module_or_hook_name': module_or_hook_name, 'args': kwargs}, wait=False)
@classmethod
async def trigger_hook_all(cls, module_or_hook_name: str, **kwargs):
for target in get_all_clients_name():
await cls.trigger_hook(target, module_or_hook_name, **kwargs)
2023-08-29 17:43:00 +00:00
2023-08-30 09:49:45 +00:00
@classmethod
async def secret_append_ip(cls):
ip_info = await fetch_ip_info()
for target in get_all_clients_name():
await cls.add_job(target, 'secret_append_ip', ip_info, wait=False)
2023-11-06 12:35:28 +00:00
@classmethod
async def send_message(cls, target_client: str, target_id: str, message):
await cls.add_job(target_client, 'send_message', {'target_id': target_id, 'message': message})
2023-08-27 13:36:11 +00:00
2023-08-29 13:04:36 +00:00
def return_val(tsk, value: dict, status=True):
2023-11-07 06:48:19 +00:00
status = {'status': status}
if value:
value = value.update(status)
else:
value = status
2023-08-29 13:04:36 +00:00
BotDBUtil.JobQueue.return_val(tsk, value)
2023-08-27 13:36:11 +00:00
async def check_job_queue():
for tskid in _queue_tasks:
tsk = BotDBUtil.JobQueue.get(tskid)
if tsk.hasDone:
_queue_tasks[tskid]['result'] = json.loads(tsk.returnVal)
_queue_tasks[tskid]['flag'].set()
get_all = BotDBUtil.JobQueue.get_all(target_client=Bot.FetchTarget.name)
for tsk in get_all:
Logger.debug(f'Received job queue task {tsk.taskid}, action: {tsk.action}')
args = json.loads(tsk.args)
2023-11-06 12:35:28 +00:00
Logger.debug(f'Args: {args}')
2023-08-29 13:04:36 +00:00
try:
if tsk.action == 'validate_permission':
fetch = await Bot.FetchTarget.fetch_target(args['target_id'], args['sender_id'])
if fetch:
2023-09-01 14:38:32 +00:00
return_val(tsk, {'value': await fetch.parent.check_permission()})
2023-11-06 12:35:28 +00:00
else:
return_val(tsk, {'value': False})
2023-08-29 14:08:47 +00:00
if tsk.action == 'trigger_hook':
2023-08-29 17:43:00 +00:00
await Bot.Hook.trigger(args['module_or_hook_name'], args['args'])
2023-08-29 14:08:47 +00:00
return_val(tsk, {})
2023-08-30 09:49:45 +00:00
if tsk.action == 'secret_append_ip':
append_ip(args)
return_val(tsk, {})
2023-11-06 12:35:28 +00:00
if tsk.action == 'send_message':
return_val(tsk, {'send': True})
2023-11-07 06:48:19 +00:00
try:
await Bot.send_message(args['target_id'], MessageChain(args['message']))
except Exception:
Logger.error(traceback.format_exc())
return_val(tsk, {'send': False})
2023-11-06 12:35:28 +00:00
if tsk.action == 'lagrange_keepalive':
Temp.data['lagrange_keepalive'] = datetime.now().timestamp()
return_val(tsk, {})
if tsk.action == 'lagrange_available_groups':
Temp.data['lagrange_available_groups'] = args
return_val(tsk, {})
2023-08-29 14:08:47 +00:00
2023-08-29 13:04:36 +00:00
except Exception as e:
return_val(tsk, {'traceback': traceback.format_exc()}, status=False)