feat : 入群消息和自定事件触发接口

This commit is contained in:
Wbucket
2026-09-30 13:21:45 +08:00
parent 65506af610
commit f7ad06c085
2 changed files with 80 additions and 18 deletions
+1
View File
@@ -173,3 +173,4 @@ cython_debug/
# PyPI configuration file
.pypirc
.*
+79 -18
View File
@@ -1,21 +1,48 @@
from typing import Any, List
import botpy
from botpy.connection import ConnectionSession
from botpy.message import (Message)
from botpy import logger
from botpy.flags import (Flag,fill_with_flags)
from botpy import( logger,Intents,Client)
from botpy.gateway import (BotWebSocket)
import queue
from botpy.types.session import Session
from dotenv import load_dotenv
import os
import types
from bobby import bobbySession
from mcwatcher import watcher
# from bobby import bobbySession
# from mcwatcher import watcher
from threading import Thread
import asyncio
#环境配置
class djtuWebsocket (botpy.Client) :
class Intents_ex(Intents):
def __init__(self, **kwargs: bool) -> None:
arg_tmp = dict[str,bool]()
arg_ex = dict[str,bool]()
for key, value in kwargs.items():
if key in ['member_event']:
arg_ex[key] = value
else:
arg_tmp[key] = value
super().__init__(**arg_tmp)
for key , value in arg_ex.items() :
setattr(self, key, value)
@Flag
def member_event(self):
return 1 << 24
class BotWebsocket_ex(BotWebSocket):
def __init__(self, session: Session, _connection: ConnectionSession):
super().__init__(session, _connection)
self._parser['group_member_add'] = lambda aaw:self._connection.dispatch("group_member_add",aaw)
class djtuWebsocket (Client) :
def __init__(
self, intents: botpy.Intents,
self, intents: Intents,
timeout: int = 5,
is_sandbox=False,
log_config: str | dict | None = None,
@@ -25,19 +52,53 @@ class djtuWebsocket (botpy.Client) :
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 bot_connect(self, session):
"""
newConnect 启动一个新的连接,如果连接在监听过程中报错了,或者被远端关闭了链接,需要识别关闭的原因,能否继续 resume
如果能够 resume,则往 sessionChan 中放入带有 sessionID 的 session
如果不能,则清理掉 sessionID,将 session 放入 sessionChan 中
session 的启动,交给 start 中的 for 循环执行,session 不自己递归进行重连,避免递归深度过深
param session: session对象
"""
logger.info("[botpy] 会话启动中...")
client = BotWebsocket_ex(session, self._connection)
try:
await client.ws_connect()
except (Exception, KeyboardInterrupt, SystemExit) as e:
await client.on_error(e)
async def on_group_at_message_create(self, message: Message):
await self.parseCommand(message)
async def on_group_message_create(self,message:Message):
await self.parseGlobalMessage(message)
# 目前不启用
# return self.parseGlobalMessage(message)
return
async def on_group_member_add(self,payload):
# await message.reply(content="awdwa")
openid = 'null'
memberid = 'null'
eid ='null'
try :
eid = payload['id']
data = payload['d']
openid = data['group_openid']
memberid = data['member_openid']
except:
logger.warning("data解析失败")
return
logger.info("入群信息:"+' 群: '+openid+" openid: "+memberid)
print("palayload"+str(payload))
await self.api.post_group_message(openid,event_id=eid,content='欢迎加入大海啸!\n入服教程请看链接:\nhttps://starptr.top')
# 触发概率不大所以可以直接提取关键字
async def parseCommand(self,msg :Message):
commands:dict[str,types.MethodType|types.FunctionType] = {
r'/邀请码' : bobby.getInviteCode,
# r'/邀请码' : bobby.getInviteCode,
r'吃什么' : lambda :"是啊吃什么"
}
required = msg.content
@@ -54,8 +115,8 @@ class djtuWebsocket (botpy.Client) :
await msg.reply(content=reply)
# 触发概率大,以后要做好解析防止刷屏
# async def parseGlobalMessage(self,msg:Message):
# await msg.reply(content="awda")
async def parseGlobalMessage(self,msg:Message):
await msg.reply(content="awda")
# 监听队列,接受其他线程的消息
async def mcloop(self):
@@ -91,7 +152,7 @@ if bbyAccount is None or bbyPasswd is None :
raise SystemError("未找到账密配置")
if appid is None or secret_bot is None :
raise SystemError("未找到bot配置")
bobby = bobbySession(bbyAccount,bbyPasswd)
# bobby = bobbySession(bbyAccount,bbyPasswd)
async def main(ws:djtuWebsocket, *args: Any, **kwargs: Any) -> None:
async with ws as ws:
@@ -109,15 +170,15 @@ async def main(ws:djtuWebsocket, *args: Any, **kwargs: Any) -> None:
logger.error(e)
# bot初始化
ws = djtuWebsocket(botpy.Intents(public_messages=True))
ws = djtuWebsocket(Intents_ex(public_messages=True,member_event=True))
# 启动mcwatcher线程
def pushQuene(cont:str):
ws.q.put(cont)
Thread(target=watcher.MCWatcher,name="watcher",kwargs={
"hookfunction":pushQuene,
"logging":logger
}).start()
# Thread(target=watcher.MCWatcher,name="watcher",kwargs={
# "hookfunction":pushQuene,
# "logging":logger
# }).start()
# bot线程运行
asyncio.run(main(ws,appid=appid,secret=secret_bot))