feat : 入群消息和自定事件触发接口
This commit is contained in:
@@ -173,3 +173,4 @@ cython_debug/
|
|||||||
|
|
||||||
# PyPI configuration file
|
# PyPI configuration file
|
||||||
.pypirc
|
.pypirc
|
||||||
|
.*
|
||||||
@@ -1,21 +1,48 @@
|
|||||||
from typing import Any, List
|
from typing import Any, List
|
||||||
|
|
||||||
import botpy
|
|
||||||
|
from botpy.connection import ConnectionSession
|
||||||
from botpy.message import (Message)
|
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
|
import queue
|
||||||
|
from botpy.types.session import Session
|
||||||
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 mcwatcher import watcher
|
||||||
from threading import Thread
|
from threading import Thread
|
||||||
import asyncio
|
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__(
|
def __init__(
|
||||||
self, intents: botpy.Intents,
|
self, intents: Intents,
|
||||||
timeout: int = 5,
|
timeout: int = 5,
|
||||||
is_sandbox=False,
|
is_sandbox=False,
|
||||||
log_config: str | dict | None = None,
|
log_config: str | dict | None = None,
|
||||||
@@ -26,18 +53,52 @@ class djtuWebsocket (botpy.Client) :
|
|||||||
self.q = queue.Queue()
|
self.q = queue.Queue()
|
||||||
super().__init__(intents, timeout, is_sandbox, log_config, log_format, log_level, bot_log, ext_handlers)
|
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):
|
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):
|
||||||
|
# 目前不启用
|
||||||
|
# return self.parseGlobalMessage(message)
|
||||||
|
return
|
||||||
|
|
||||||
await self.parseGlobalMessage(message)
|
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):
|
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,
|
||||||
r'吃什么' : lambda :"是啊吃什么"
|
r'吃什么' : lambda :"是啊吃什么"
|
||||||
}
|
}
|
||||||
required = msg.content
|
required = msg.content
|
||||||
@@ -54,8 +115,8 @@ class djtuWebsocket (botpy.Client) :
|
|||||||
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):
|
async def mcloop(self):
|
||||||
@@ -91,7 +152,7 @@ if bbyAccount is None or bbyPasswd is None :
|
|||||||
raise SystemError("未找到账密配置")
|
raise SystemError("未找到账密配置")
|
||||||
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)
|
||||||
|
|
||||||
async def main(ws:djtuWebsocket, *args: Any, **kwargs: Any) -> None:
|
async def main(ws:djtuWebsocket, *args: Any, **kwargs: Any) -> None:
|
||||||
async with ws as ws:
|
async with ws as ws:
|
||||||
@@ -109,15 +170,15 @@ async def main(ws:djtuWebsocket, *args: Any, **kwargs: Any) -> None:
|
|||||||
logger.error(e)
|
logger.error(e)
|
||||||
|
|
||||||
# bot初始化
|
# bot初始化
|
||||||
ws = djtuWebsocket(botpy.Intents(public_messages=True))
|
ws = djtuWebsocket(Intents_ex(public_messages=True,member_event=True))
|
||||||
|
|
||||||
# 启动mcwatcher线程
|
# 启动mcwatcher线程
|
||||||
def pushQuene(cont:str):
|
def pushQuene(cont:str):
|
||||||
ws.q.put(cont)
|
ws.q.put(cont)
|
||||||
Thread(target=watcher.MCWatcher,name="watcher",kwargs={
|
# Thread(target=watcher.MCWatcher,name="watcher",kwargs={
|
||||||
"hookfunction":pushQuene,
|
# "hookfunction":pushQuene,
|
||||||
"logging":logger
|
# "logging":logger
|
||||||
}).start()
|
# }).start()
|
||||||
|
|
||||||
# bot线程运行
|
# bot线程运行
|
||||||
asyncio.run(main(ws,appid=appid,secret=secret_bot))
|
asyncio.run(main(ws,appid=appid,secret=secret_bot))
|
||||||
|
|||||||
Reference in New Issue
Block a user