From d72534c0c3e78d2968e03a6683f17c19f5c06a31 Mon Sep 17 00:00:00 2001 From: hubian <908234780@qq.com> Date: Sat, 11 Apr 2026 22:38:47 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BD=BF=E7=94=A8sync=5Fforever?= =?UTF-8?q?=E5=92=8C=E5=8A=A0=E5=AF=86=E5=AD=98=E5=82=A8=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=8A=A0=E5=AF=86=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 改用 sync_forever 自动处理事件回调 - 添加 matrix_store 存储路径用于密钥存储 - 初始同步后再注册回调 - 注册 MegolmEvent 处理器 问题:两个房间都是加密状态,需要密钥解密 --- ai_chat.db | Bin 69632 -> 69632 bytes .../matrix_service.cpython-310.pyc | Bin 6707 -> 7537 bytes services/matrix_service.py | 42 +++++++++++++++--- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/ai_chat.db b/ai_chat.db index 3b7bd7ac27f031db06d6019f9667b98d013aec60..87706e51ec04517bb4686495ca177186603a78b6 100644 GIT binary patch delta 38 scmZozz|ydQWr7qFJM%;tCm^{o;iVL}g_WVXo~4O_xuMbK5a~5v0L*&}8UO$Q delta 38 tcmZozz|ydQWr7qF+y99&PC#;F!b>S`Q!7JrJxe2FQxn6@A<}EU008|}4GsVR diff --git a/services/__pycache__/matrix_service.cpython-310.pyc b/services/__pycache__/matrix_service.cpython-310.pyc index faece90ee6c7c56c7a493b4a1c47a3da0a9ac311..90ca3a063478fddf9f0824108e62b3d6a3fd020e 100644 GIT binary patch delta 2161 zcmZ`(TWnNC7(O%SvS-iU&fePH?G{Q;s7=U8u$o9(=)g`RAP70*&rwzL_)s zKmTp!|K`@;?gDNv81<4MsL5am3q!7sBH2c18c7uolFBL2 z@{thpv~-9`d?WsfF7}yT3(QLH$vt4d;(660ytu2QNI5EH!W;*7SL<4_FiwZ8x@V}6 zx2?Qg_ly<~*`+aynozI0@^XQcK*`Dzi;l-(>*j~=&0jvzxO%d2{Blp1E7(-_tmzV( zn|3X%1D!kC=vv!4W{;=fWB$$B;(^BLT4U~%Yoe!XJXIC)i&HmdPTZ?CfAPxA&)@Iq zq6oy9AbkiX+6_?m&_ZD}J51`j^$G+lR-VIy#X;Mqbi2^X2-qo9&FmO03|Ylub`)Un zkVPL8vdsdX6tD%LO1A=Lyfg_@T@lvns$;qyCe{!wjoB8-HcLaF5yzetAUx2g1qdrt zr0GJ3SZx3}2&1?P08gYamQ5T)e)yYs8TQLC{!S=CWO|W~(nz1cfALF!bs-h>br{Z5 z%}IPA(6`)uH!_3wn)5o(28(AyFuZVWd=3A{?2O*JcCvBi(}jt%jdx#fod4w3wKx9Y zo#B<;BAT6pHXT0Jc<1W;$+bfI@k?E0+|!jY=uX}jja8lG>S_^Aj5!6TyhAU;{DCq?`l|W!k8Q34AZUeJBP)IhjdW#a1V!iaLYJ zedRkgwA&=AXiUp_Y@NtNA?mbT@i3WaU}qoGYF_5a8MCOOLxcK+4FZh~z3CJg{P>~S zt9mZbas?p-X}>_|d)Rl57}Ij=$N)4eQ){8w<{g0xv+2Uiyv5wTF7pcW5?@jR=UOfd z)(ql@&;oGRA{k7A=VcO_R@YaIau8fba#6>fNy5{MF%C%i6fi@q^Z_t~511hcQO8My z{~TIT)oN|REad06+iMBtpG9tjh{RkEALh?<5P>I$Y*!<+6&T?KJaEA}6TDvMo)Ee`G$geeu?o++p)Rfi*kFMNheu z<@V8yvr~=Q7xQ0FE=+uR^Q*V%0LXXo!SET>%l`}~9~6D#wvp%+=%52I391>f=nf$h zyv3i2>@bCZ4heAg`Gv@uWLA6&N!>qQv}mg_XfOXI(v9gZ9*S;`bke9$b9nMavFhce z=zdL5COyD^iayGNv4_zi{zPnf)ahM^zxE2T2#=RyV{y^sGcbym0Put%i!S9#d?Uhq zOS~He`Dpy{&eT2qx|Cmg=e~_cQIPHi0~y?8Oa6P?#A=5{%CPnnAy-l2ygIleskv9BVuoH`ugKPERm e&;{R$q|2ZTv=c*VELhmU3RX~1ma0bh_yi`Hi7DRm6RIRj&Zs}H+ZRd39aW`4!oV2@P z!fx3L1shlx5k-aMwTiYZ^hN254}$n4J{_TNF8Jt!px}f5Bd+h;{M znLtVIP6Awk<;i|zyGT?`{2D(YzD>l4t%$OHb_=^9j+P8Ryo37MF7D0u{_#z&?cl!7 zbvNQisZK-G7%2S^S84ct!Wh?wF&=WQ5$+ot4dWboP;*3Dh>|&kkxzy?jc~)YKSN)T z5yprkH^E$qG%C->6|sTRLR*uP1+;*;HcXD7oRWD26sajin1{U^|EFxLJWQ8egvbQ1#=f@ zM(n0$w)A09HU@=JzceiK=m<~L^iiMv5>V%N@uqo* zyTBt8$HXV8(pF*@v)b4*Ig8EJu{aatmIm4(ugfqAp_LCv0X=dYBiF?(W~ewSVKA+4^FSyj$;)*}C{S{V8sV)lA{p z(~!$r0DC>_vP|G;%Mfaz?S3dk$X|w{x}f>oWd^1lcTzPMMZ`XTui{a_gm8IPSpmz6K!M zx?*A*tJow}B3{d%!m8NLH?b|g%D*gj6IH@md$^FonV!D(jBL^%L1@ie@i*5Uwk#ei zZtKz@=8F&G6>SB!55!;i@=OsS(rt7o>MGl>h($ diff --git a/services/matrix_service.py b/services/matrix_service.py index 67403e1..3d01fb5 100644 --- a/services/matrix_service.py +++ b/services/matrix_service.py @@ -103,13 +103,31 @@ class MatrixBot: """处理加密消息(MegolmEvent)""" logger.info(f"收到加密消息: [{room.room_id}] event_id={event.event_id}") - # MegolmEvent 需要解密,nio 会自动解密并转换为普通消息事件 - # 解密后会触发 RoomMessageText 回调,所以这里只是记录 - # 如果解密失败,检查是否有密钥 - pass + # nio 解密 MegolmEvent 后,需要获取解密的内容 + try: + # 检查是否有解密后的内容 + if hasattr(event, 'source') and event.source: + decrypted_content = event.source.get('content', {}) + msgtype = decrypted_content.get('msgtype', '') + body = decrypted_content.get('body', '') + + sender = event.source.get('sender', event.sender) + + logger.info(f"解密消息: sender={sender}, body={body[:50]}") + + # 如果是文本消息,处理它 + if msgtype == 'm.text' and body: + # 调用消息处理逻辑 + await self._process_message(room, sender, body, event.event_id) + else: + logger.warning(f"加密消息无法解密: {event.event_id}") + except Exception as e: + logger.error(f"处理加密消息失败: {e}") + import traceback + logger.error(traceback.format_exc()) async def _handle_nio_message(self, room, event): - """处理 nio 收到的消息""" + """处理 nio 收到的消息(普通文本)""" # 忽略自己发送的消息 sender = event.sender if sender == self.user_id: @@ -118,7 +136,17 @@ class MatrixBot: message_text = event.body.strip() - logger.info(f"Matrix收到消息: [{room.room_id}] {sender}: {message_text}") + logger.info(f"Matrix收到文本消息: [{room.room_id}] {sender}: {message_text}") + + # 调用统一处理方法 + await self._process_message(room, sender, message_text, event.event_id) + + async def _process_message(self, room, sender, message_text, event_id): + """处理消息的核心逻辑""" + # 忽略自己发送的消息 + if sender == self.user_id: + logger.debug(f"忽略自己发送的消息: {sender}") + return # 保存房间ID self.last_room_id = room.room_id @@ -162,7 +190,7 @@ class MatrixBot: content=message_text, source='matrix', extra_data={ - 'event_id': event.event_id, + 'event_id': event_id, 'room_id': room.room_id, 'sender': sender }