diff --git a/.gitignore b/.gitignore index 69169fd..c98c909 100644 --- a/.gitignore +++ b/.gitignore @@ -173,3 +173,4 @@ cython_debug/ # PyPI configuration file .pypirc +.* \ No newline at end of file diff --git a/bot.py b/bot.py index 9478e10..21921f6 100644 --- a/bot.py +++ b/bot.py @@ -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))