mirror of
https://github.com/Genshin-bots/gsuid_core.git
synced 2025-05-12 06:55:49 +08:00
✨ 支持设置定时任务
This commit is contained in:
parent
3a6c9f70f6
commit
3f0ab97b04
1
.gitignore
vendored
1
.gitignore
vendored
@ -665,3 +665,4 @@ FodyWeavers.xsd
|
||||
config.json
|
||||
res_data
|
||||
GsData.db
|
||||
GenshinUID
|
||||
|
17
gsuid_core/aps.py
Normal file
17
gsuid_core/aps.py
Normal file
@ -0,0 +1,17 @@
|
||||
from apscheduler.schedulers.asyncio import AsyncIOScheduler
|
||||
|
||||
from gsuid_core.logger import logger
|
||||
|
||||
scheduler = AsyncIOScheduler()
|
||||
|
||||
|
||||
async def start_scheduler():
|
||||
if not scheduler.running:
|
||||
scheduler.start()
|
||||
logger.info('定时任务启动...')
|
||||
|
||||
|
||||
async def shutdown_scheduler():
|
||||
if scheduler.running:
|
||||
scheduler.shutdown()
|
||||
logger.info('定时任务结束...')
|
@ -1,12 +1,13 @@
|
||||
import asyncio
|
||||
from typing import List, Union, Optional
|
||||
from typing import List, Union, Literal, Optional
|
||||
|
||||
from logger import logger
|
||||
from fastapi import WebSocket
|
||||
from gs_logger import GsLogger
|
||||
from segment import MessageSegment
|
||||
from msgspec import json as msgjson
|
||||
from models import Message, MessageSend
|
||||
|
||||
from gsuid_core.logger import logger
|
||||
from gsuid_core.gs_logger import GsLogger
|
||||
from gsuid_core.segment import MessageSegment
|
||||
from gsuid_core.models import Message, MessageSend
|
||||
|
||||
|
||||
class Bot:
|
||||
@ -21,6 +22,18 @@ class Bot:
|
||||
self.user_type: Optional[str] = None
|
||||
|
||||
async def send(self, message: Union[Message, List[Message], str, bytes]):
|
||||
await self.target_send(
|
||||
message,
|
||||
self.user_type, # type:ignore
|
||||
self.group_id if self.group_id else self.user_id,
|
||||
)
|
||||
|
||||
async def target_send(
|
||||
self,
|
||||
message: Union[Message, List[Message], str, bytes],
|
||||
target_type: Literal['group', 'driect', 'channel', 'sub_channel'],
|
||||
target_id: Optional[str],
|
||||
):
|
||||
if isinstance(message, Message):
|
||||
message = [message]
|
||||
elif isinstance(message, str):
|
||||
@ -33,8 +46,8 @@ class Bot:
|
||||
send = MessageSend(
|
||||
content=message,
|
||||
bot_id=self.bot_id,
|
||||
target_type=self.user_type,
|
||||
target_id=self.group_id if self.group_id else self.user_id,
|
||||
target_type=target_type,
|
||||
target_id=target_id,
|
||||
)
|
||||
logger.info(f'[发送消息] {send}')
|
||||
await self.bot.send_bytes(msgjson.encode(send))
|
||||
|
@ -36,7 +36,7 @@ class GsClient:
|
||||
intent = await self._input()
|
||||
msg = MessageReceive(
|
||||
bot_id='Nonebot',
|
||||
user_type='DIRECT',
|
||||
user_type='direct',
|
||||
user_pm=2,
|
||||
group_id=None,
|
||||
user_id='5253123',
|
||||
|
@ -1,13 +1,18 @@
|
||||
import sys
|
||||
import asyncio
|
||||
from pathlib import Path
|
||||
|
||||
import uvicorn
|
||||
from gss import gss
|
||||
from config import core_config
|
||||
from handler import handle_event
|
||||
from models import MessageReceive
|
||||
from msgspec import json as msgjson
|
||||
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
|
||||
|
||||
sys.path.append(str(Path(__file__).parents[1]))
|
||||
from gsuid_core.gss import gss # noqa: E402
|
||||
from gsuid_core.config import core_config # noqa: E402
|
||||
from gsuid_core.handler import handle_event # noqa: E402
|
||||
from gsuid_core.models import MessageReceive # noqa: E402
|
||||
from gsuid_core.aps import start_scheduler, shutdown_scheduler # noqa: E402
|
||||
|
||||
app = FastAPI()
|
||||
HOST = core_config.get_config('HOST')
|
||||
PORT = int(core_config.get_config('PORT'))
|
||||
@ -32,5 +37,15 @@ async def websocket_endpoint(websocket: WebSocket, bot_id: str):
|
||||
await asyncio.gather(process(), start())
|
||||
|
||||
|
||||
@app.on_event('startup')
|
||||
async def startup_event():
|
||||
await start_scheduler()
|
||||
|
||||
|
||||
@app.on_event('shutdown')
|
||||
async def shutdown_event():
|
||||
await shutdown_scheduler()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
uvicorn.run(app, host=HOST, port=PORT)
|
||||
|
@ -1,10 +1,11 @@
|
||||
from typing import Literal
|
||||
|
||||
from fastapi import WebSocket
|
||||
from models import MessageSend
|
||||
from segment import MessageSegment
|
||||
from msgspec import json as msgjson
|
||||
|
||||
from gsuid_core.models import MessageSend
|
||||
from gsuid_core.segment import MessageSegment
|
||||
|
||||
|
||||
class GsLogger:
|
||||
def __init__(self, bot_id: str, ws: WebSocket):
|
||||
|
@ -1,6 +1,16 @@
|
||||
from server import GsServer
|
||||
from gsuid_core.aps import scheduler
|
||||
from gsuid_core.server import GsServer
|
||||
|
||||
gss = GsServer()
|
||||
if not gss.is_load:
|
||||
gss.is_load = True
|
||||
gss.load_plugins()
|
||||
|
||||
repeat_jobs = {}
|
||||
for i in scheduler.get_jobs():
|
||||
if i.name not in repeat_jobs:
|
||||
repeat_jobs[i.name] = i
|
||||
else:
|
||||
scheduler.remove_job(i.id)
|
||||
|
||||
del repeat_jobs
|
||||
|
@ -1,11 +1,10 @@
|
||||
import asyncio
|
||||
|
||||
from bot import Bot
|
||||
from trigger import Trigger
|
||||
from config import core_config
|
||||
from models import MessageContent, MessageReceive
|
||||
|
||||
from gsuid_core.sv import SL
|
||||
from gsuid_core.bot import Bot
|
||||
from gsuid_core.trigger import Trigger
|
||||
from gsuid_core.config import core_config
|
||||
from gsuid_core.models import MessageContent, MessageReceive
|
||||
|
||||
config_masters = core_config.get_config('masters')
|
||||
config_superusers = core_config.get_config('superusers')
|
||||
|
@ -1,19 +0,0 @@
|
||||
from functools import wraps
|
||||
from typing import Callable, Optional
|
||||
|
||||
from gsuid_core.server import gss
|
||||
from gsuid_core.logger import logger
|
||||
|
||||
|
||||
def on_bot_connect():
|
||||
def deco(func: Callable) -> Callable:
|
||||
gss.bot_connect_def.append(func)
|
||||
|
||||
@wraps(func)
|
||||
async def wrapper(*args, **kwargs) -> Optional[Callable]:
|
||||
logger.info('@on_bot_connect已成功调用...')
|
||||
return await func(*args, **kwargs)
|
||||
|
||||
return wrapper
|
||||
|
||||
return deco
|
@ -1,4 +1,4 @@
|
||||
from typing import Any, List, Optional
|
||||
from typing import Any, List, Literal, Optional
|
||||
|
||||
from msgspec import Struct
|
||||
|
||||
@ -10,7 +10,9 @@ class Message(Struct):
|
||||
|
||||
class MessageReceive(Struct, frozen=True):
|
||||
bot_id: str = 'Bot'
|
||||
user_type: Optional[str] = None
|
||||
user_type: Optional[
|
||||
Literal['group', 'direct', 'channel', 'sub_channel']
|
||||
] = None
|
||||
group_id: Optional[str] = None
|
||||
user_id: str = ''
|
||||
user_pm: int = 3
|
||||
|
@ -3,7 +3,8 @@ from base64 import b64encode
|
||||
from typing import List, Union, Literal
|
||||
|
||||
from PIL import Image
|
||||
from models import Message
|
||||
|
||||
from gsuid_core.models import Message
|
||||
|
||||
|
||||
class MessageSegment:
|
||||
|
@ -4,11 +4,10 @@ import importlib
|
||||
from pathlib import Path
|
||||
from typing import Dict, Callable
|
||||
|
||||
from bot import Bot
|
||||
from logger import logger
|
||||
from fastapi import WebSocket
|
||||
|
||||
sys.path.append(str(Path(__file__).parents[1]))
|
||||
from gsuid_core.bot import Bot
|
||||
from gsuid_core.logger import logger
|
||||
|
||||
|
||||
class GsServer:
|
||||
@ -25,10 +24,12 @@ class GsServer:
|
||||
|
||||
def __init__(self):
|
||||
if not self.is_initialized:
|
||||
self.active_bot: Dict[str, WebSocket] = {}
|
||||
self.active_ws: Dict[str, WebSocket] = {}
|
||||
self.active_bot: Dict[str, Bot] = {}
|
||||
self.is_initialized = True
|
||||
|
||||
def load_plugins(self):
|
||||
logger.info('开始导入插件...')
|
||||
sys.path.append(str(Path(__file__).parents[1]))
|
||||
plug_path = Path(__file__).parent / 'plugins'
|
||||
# 遍历插件文件夹内所有文件
|
||||
@ -57,21 +58,23 @@ class GsServer:
|
||||
|
||||
async def connect(self, websocket: WebSocket, bot_id: str) -> Bot:
|
||||
await websocket.accept()
|
||||
self.active_bot[bot_id] = websocket
|
||||
self.active_ws[bot_id] = websocket
|
||||
self.active_bot[bot_id] = bot = Bot(bot_id, websocket)
|
||||
logger.info(f'{bot_id}已连接!')
|
||||
_task = [_def() for _def in self.bot_connect_def]
|
||||
asyncio.gather(*_task)
|
||||
return Bot(bot_id, websocket)
|
||||
return bot
|
||||
|
||||
def disconnect(self, bot_id: str):
|
||||
del self.active_ws[bot_id]
|
||||
del self.active_bot[bot_id]
|
||||
logger.warning(f'{bot_id}已中断!')
|
||||
|
||||
async def send(self, message: str, bot_id: str):
|
||||
await self.active_bot[bot_id].send_text(message)
|
||||
await self.active_ws[bot_id].send_text(message)
|
||||
|
||||
async def broadcast(self, message: str):
|
||||
for bot_id in self.active_bot:
|
||||
for bot_id in self.active_ws:
|
||||
await self.send(message, bot_id)
|
||||
|
||||
@classmethod
|
||||
|
@ -3,9 +3,9 @@ from __future__ import annotations
|
||||
from functools import wraps
|
||||
from typing import Dict, List, Tuple, Union, Literal, Callable, Optional
|
||||
|
||||
from logger import logger
|
||||
from trigger import Trigger
|
||||
from config import core_config
|
||||
from gsuid_core.logger import logger
|
||||
from gsuid_core.trigger import Trigger
|
||||
from gsuid_core.config import core_config
|
||||
|
||||
|
||||
class SVList:
|
||||
|
@ -1,6 +1,6 @@
|
||||
from typing import Literal, Callable
|
||||
|
||||
from models import MessageContent
|
||||
from gsuid_core.models import MessageContent
|
||||
|
||||
|
||||
class Trigger:
|
||||
|
Loading…
x
Reference in New Issue
Block a user