feat : 接入了noname的插件到bot(多线程运行)

This commit is contained in:
Wbucket
2026-09-17 18:59:52 +08:00
parent e2a377edc3
commit edce5dc3be
3 changed files with 81 additions and 12 deletions
+72 -7
View File
@@ -1,14 +1,32 @@
from typing import Any, List
import botpy import botpy
from botpy.message import Message from botpy.message import (Message)
from botpy import logger
import queue
from dotenv import load_dotenv from dotenv import load_dotenv
import os import os
import types import types
from bobby import bobbySession from bobby import bobbySession
from mcwatcher import watcher
from threading import Thread
import asyncio
#环境配置 #环境配置
class djtuWebsocket (botpy.Client) : class djtuWebsocket (botpy.Client) :
def __init__(
self, intents: botpy.Intents,
timeout: int = 5,
is_sandbox=False,
log_config: str | dict | None = None,
log_format: str| None = None,
log_level: int |None= None,
bot_log: bool | None = True,
ext_handlers: dict | List[dict] | bool = True):
self.q = queue.Queue()
super().__init__(intents, timeout, is_sandbox, log_config, log_format, log_level, bot_log, ext_handlers)
async def on_group_at_message_create(self, message: Message): async def on_group_at_message_create(self, message: Message):
await self.parseCommand(message) await self.parseCommand(message)
async def on_group_message_create(self,message:Message): async def on_group_message_create(self,message:Message):
@@ -16,6 +34,7 @@ class djtuWebsocket (botpy.Client) :
await self.parseGlobalMessage(message) await self.parseGlobalMessage(message)
# 触发概率不大所以可以直接提取关键字
async def parseCommand(self,msg :Message): async def parseCommand(self,msg :Message):
commands:dict[str,types.MethodType|types.FunctionType] = { commands:dict[str,types.MethodType|types.FunctionType] = {
r'/邀请码' : bobby.getInviteCode, r'/邀请码' : bobby.getInviteCode,
@@ -34,17 +53,38 @@ class djtuWebsocket (botpy.Client) :
reply = "你在发什么东西我怎么看不懂?" reply = "你在发什么东西我怎么看不懂?"
await msg.reply(content=reply) await msg.reply(content=reply)
# 触发概率大,以后要做好解析防止刷屏
async def parseGlobalMessage(self,msg:Message): async def parseGlobalMessage(self,msg:Message):
await msg.reply(content="awda") await msg.reply(content="awda")
# 监听队列,接受其他线程的消息
async def mcloop(self):
while True:
if self.q.empty():
# time.sleep会阻塞整个线程我去
await asyncio.sleep(20)
else:
try :
msg = self.q.get()
if group_open_id is None:
logger.error("群聊不存在")
continue
asyncio.create_task(self.api.post_group_message(group_open_id,content=msg))
except Exception as e:
logger.error("MCWatcher发送群聊任务失败:\n"+str(e))
# source # source
load_dotenv(".env") load_dotenv(".env")
print(os.getenv("APP_ID"))
bbyAccount = os.getenv("BOBBY_ACCOUNT") bbyAccount = os.getenv("BOBBY_ACCOUNT")
bbyPasswd = os.getenv("BOBBY_PASSWORD") bbyPasswd = os.getenv("BOBBY_PASSWORD")
appid = os.getenv("APP_ID") appid = os.getenv("APP_ID")
secret_bot = os.getenv("SECRET") secret_bot = os.getenv("SECRET")
group_open_id = os.getenv("GROUP_OPEN_ID")
if appid is None or secret_bot is None :
raise SystemExit("未找到bot配置!")
logger.info("登录账号:"+appid)
# bobby Session # bobby Session
if bbyAccount is None or bbyPasswd is None : if bbyAccount is None or bbyPasswd is None :
@@ -52,7 +92,32 @@ if bbyAccount is None or bbyPasswd is None :
if appid is None or secret_bot is None : if appid is None or secret_bot is None :
raise SystemError("未找到bot配置") raise SystemError("未找到bot配置")
bobby = bobbySession(bbyAccount,bbyPasswd) bobby = bobbySession(bbyAccount,bbyPasswd)
#bot 启动 async def main(ws:djtuWebsocket, *args: Any, **kwargs: Any) -> None:
async with ws as ws:
logger.info("启动并发异步ing...")
mcloop = ws.mcloop()
# 你*的为什么retcoro true的话会报错啊
# 协程对象不会不是这个异步回话而是httpx吧?
bot = ws.start(*args, **kwargs,ret_coro=False)
if bot is None:
logger.error("bot不给协程啊")
return
try:
await asyncio.gather(bot,mcloop)
except Exception as e :
logger.error(e)
# bot初始化
ws = djtuWebsocket(botpy.Intents(public_messages=True)) ws = djtuWebsocket(botpy.Intents(public_messages=True))
ws.run(appid=appid,secret=secret_bot)
# 启动mcwatcher线程
def pushQuene(cont:str):
ws.q.put(cont)
Thread(target=watcher.MCWatcher,name="watcher",kwargs={
"hookfunction":pushQuene,
"logging":logger
}).start()
# bot线程运行
asyncio.run(main(ws,appid=appid,secret=secret_bot))
+7 -4
View File
@@ -6,7 +6,7 @@ import re
from pathlib import Path from pathlib import Path
from datetime import datetime from datetime import datetime
from typing import Dict, Any, Optional, Set from typing import Dict, Any, Optional, Set
import time
import httpx import httpx
from zoneinfo import ZoneInfo, ZoneInfoNotFoundError from zoneinfo import ZoneInfo, ZoneInfoNotFoundError
@@ -142,7 +142,7 @@ class MCWatcher:
self.state.load() self.state.load()
self._stop = False self._stop = False
self._task = asyncio.run(self._poll_loop()) self._task = asyncio.run(self._poll_loop())
# self._task = asyncio.create_task(self._poll_loop()) # self._task = asyncio.create_task(self._poll_loop())
logger.info( logger.info(
@@ -154,7 +154,7 @@ class MCWatcher:
if self._task: if self._task:
self._task.cancel() self._task.cancel()
# try: # try:
# # await self._task # await self._task
# except asyncio.CancelledError: # except asyncio.CancelledError:
# pass # pass
self.state.save() self.state.save()
@@ -243,6 +243,9 @@ class MCWatcher:
# ========== 轮询 ========== # ========== 轮询 ==========
async def _poll_loop(self): async def _poll_loop(self):
logger.info("等待bot完毕~")
# 防止bot未初始化
time.sleep(10)
try: try:
await self._check_once(force_push=False) await self._check_once(force_push=False)
except Exception as e: except Exception as e:
@@ -353,4 +356,4 @@ class MCWatcher:
# logger.info(f"{_ts()} MCWatcher 已推送 {ok}/{len(targets)} 个会话。") # logger.info(f"{_ts()} MCWatcher 已推送 {ok}/{len(targets)} 个会话。")
async def _broadcast(self, text: str, targets: Set[str]): async def _broadcast(self, text: str, targets: Set[str]):
self.hookfunction.__call__(text,targets) self.hookfunction(text)
+2 -1
View File
@@ -1,3 +1,4 @@
requests requests
qq-botpy qq-botpy
dotenv dotenv
httpx