ayaka.driver.ayakabot_driver.driver

  1from importlib import import_module
  2import json
  3import asyncio
  4import uvicorn
  5from loguru import logger
  6from fastapi import FastAPI, WebSocket
  7from pathlib import Path
  8import re
  9
 10from .bot import Bot
 11from .event import json_to_event, MessageEvent
 12from .websocket import FastAPIWebSocket
 13from ...config import ayaka_root_config
 14
 15app = FastAPI()
 16
 17
 18class Config:
 19    port = ayaka_root_config.ayaka_port
 20    ayaka_prefix = "#"
 21    ayaka_separate = " "
 22    ayaka_exclude_old = True
 23    fastapi_reload = True
 24
 25
 26class Driver:
 27    connect_calls = []
 28    disconnect_calls = []
 29    deal_event = None
 30    config = Config()
 31
 32    def deal(self, bot, event):
 33        if self.deal_event:
 34            if isinstance(event, MessageEvent):
 35                logger.success(str(event))
 36                asyncio.create_task(self.deal_event(bot, event))
 37
 38    async def bot_connect(self, bot: Bot):
 39        ts = []
 40        for call in self.connect_calls:
 41            ts.append(asyncio.create_task(call(bot)))
 42        await asyncio.gather(*ts)
 43
 44    async def bot_disconnect(self, bot: Bot):
 45        ts = []
 46        for call in self.disconnect_calls:
 47            ts.append(asyncio.create_task(call(bot)))
 48        await asyncio.gather(*ts)
 49
 50    def on_bot_connect(self, func):
 51        self.connect_calls.append(func)
 52
 53    def on_bot_disconnect(self, func):
 54        self.disconnect_calls.append(func)
 55
 56    def on_startup(self, func):
 57        app.on_event("startup")(func)
 58
 59    def on_shutdown(self, func):
 60        app.on_event("shutdown")(func)
 61
 62
 63driver = Driver()
 64
 65
 66# 启动服务
 67def run(host="127.0.0.1", port=driver.config.port, reload=True):
 68    tip = f'''
 69您目前正在使用AYAKA BOT!
 70注意设置cqhttp连接配置为
 71- 反向ws
 72- ws://127.0.0.1:{port}/onebot/v11/ws
 73'''
 74    print(tip)
 75    uvicorn.run(
 76        app=f"{__name__}:app",
 77        host=host,
 78        port=port,
 79        reload=reload,
 80    )
 81
 82
 83def load_plugins(path):
 84    path = Path(path)
 85    for p in path.iterdir():
 86        if p.name.startswith("_"):
 87            continue
 88
 89        load_plugin(p)
 90
 91
 92def load_plugin(path):
 93    if isinstance(path, Path):
 94        p = path
 95    else:
 96        p = Path(path)
 97
 98    name = re.sub(r"\\|/", ".", str(p))
 99    name = re.sub(r".py$", "", name)
100    try:
101        import_module(name)
102        logger.opt(colors=True).success(f"导入成功 \"<y>{p.stem}</y>\"")
103    except:
104        logger.opt(colors=True).exception(f"导入失败 \"<y>{p.stem}</y>\"")
105
106
107@app.websocket("/onebot/v11/ws")
108async def endpoint(websocket: WebSocket):
109    self_id = websocket.headers.get("x-self-id")
110    ws = FastAPIWebSocket(websocket)
111    bot = Bot(ws, self_id)
112
113    # 建立ws连接
114    await ws.accept()
115    await driver.bot_connect(bot)
116
117    try:
118        # 监听循环
119        while True:
120            data = await ws.receive()
121            json_data = json.loads(data)
122            # 将json解析为对应的event
123            event = json_to_event(json_data)
124
125            if not event:
126                continue
127
128            driver.deal(bot, event)
129
130    except:
131        logger.exception("连接中断")
132    finally:
133        # 结束ws连接
134        await driver.bot_disconnect(bot)
135        await ws.close()
136
137
138def get_driver():
139    return driver
140
141
142def on_message(priority, block, handlers):
143    driver.deal_event = handlers[0]
class Config:
19class Config:
20    port = ayaka_root_config.ayaka_port
21    ayaka_prefix = "#"
22    ayaka_separate = " "
23    ayaka_exclude_old = True
24    fastapi_reload = True
Config()
class Driver:
27class Driver:
28    connect_calls = []
29    disconnect_calls = []
30    deal_event = None
31    config = Config()
32
33    def deal(self, bot, event):
34        if self.deal_event:
35            if isinstance(event, MessageEvent):
36                logger.success(str(event))
37                asyncio.create_task(self.deal_event(bot, event))
38
39    async def bot_connect(self, bot: Bot):
40        ts = []
41        for call in self.connect_calls:
42            ts.append(asyncio.create_task(call(bot)))
43        await asyncio.gather(*ts)
44
45    async def bot_disconnect(self, bot: Bot):
46        ts = []
47        for call in self.disconnect_calls:
48            ts.append(asyncio.create_task(call(bot)))
49        await asyncio.gather(*ts)
50
51    def on_bot_connect(self, func):
52        self.connect_calls.append(func)
53
54    def on_bot_disconnect(self, func):
55        self.disconnect_calls.append(func)
56
57    def on_startup(self, func):
58        app.on_event("startup")(func)
59
60    def on_shutdown(self, func):
61        app.on_event("shutdown")(func)
Driver()
def deal(self, bot, event):
33    def deal(self, bot, event):
34        if self.deal_event:
35            if isinstance(event, MessageEvent):
36                logger.success(str(event))
37                asyncio.create_task(self.deal_event(bot, event))
async def bot_connect(self, bot: ayaka.driver.ayakabot_driver.bot.Bot):
39    async def bot_connect(self, bot: Bot):
40        ts = []
41        for call in self.connect_calls:
42            ts.append(asyncio.create_task(call(bot)))
43        await asyncio.gather(*ts)
async def bot_disconnect(self, bot: ayaka.driver.ayakabot_driver.bot.Bot):
45    async def bot_disconnect(self, bot: Bot):
46        ts = []
47        for call in self.disconnect_calls:
48            ts.append(asyncio.create_task(call(bot)))
49        await asyncio.gather(*ts)
def on_bot_connect(self, func):
51    def on_bot_connect(self, func):
52        self.connect_calls.append(func)
def on_bot_disconnect(self, func):
54    def on_bot_disconnect(self, func):
55        self.disconnect_calls.append(func)
def on_startup(self, func):
57    def on_startup(self, func):
58        app.on_event("startup")(func)
def on_shutdown(self, func):
60    def on_shutdown(self, func):
61        app.on_event("shutdown")(func)
def run(host='127.0.0.1', port=19901, reload=True):
68def run(host="127.0.0.1", port=driver.config.port, reload=True):
69    tip = f'''
70您目前正在使用AYAKA BOT!
71注意设置cqhttp连接配置为
72- 反向ws
73- ws://127.0.0.1:{port}/onebot/v11/ws
74'''
75    print(tip)
76    uvicorn.run(
77        app=f"{__name__}:app",
78        host=host,
79        port=port,
80        reload=reload,
81    )
def load_plugins(path):
84def load_plugins(path):
85    path = Path(path)
86    for p in path.iterdir():
87        if p.name.startswith("_"):
88            continue
89
90        load_plugin(p)
def load_plugin(path):
 93def load_plugin(path):
 94    if isinstance(path, Path):
 95        p = path
 96    else:
 97        p = Path(path)
 98
 99    name = re.sub(r"\\|/", ".", str(p))
100    name = re.sub(r".py$", "", name)
101    try:
102        import_module(name)
103        logger.opt(colors=True).success(f"导入成功 \"<y>{p.stem}</y>\"")
104    except:
105        logger.opt(colors=True).exception(f"导入失败 \"<y>{p.stem}</y>\"")
@app.websocket('/onebot/v11/ws')
async def endpoint(websocket: starlette.websockets.WebSocket):
108@app.websocket("/onebot/v11/ws")
109async def endpoint(websocket: WebSocket):
110    self_id = websocket.headers.get("x-self-id")
111    ws = FastAPIWebSocket(websocket)
112    bot = Bot(ws, self_id)
113
114    # 建立ws连接
115    await ws.accept()
116    await driver.bot_connect(bot)
117
118    try:
119        # 监听循环
120        while True:
121            data = await ws.receive()
122            json_data = json.loads(data)
123            # 将json解析为对应的event
124            event = json_to_event(json_data)
125
126            if not event:
127                continue
128
129            driver.deal(bot, event)
130
131    except:
132        logger.exception("连接中断")
133    finally:
134        # 结束ws连接
135        await driver.bot_disconnect(bot)
136        await ws.close()
def get_driver():
139def get_driver():
140    return driver
def on_message(priority, block, handlers):
143def on_message(priority, block, handlers):
144    driver.deal_event = handlers[0]