This commit is contained in:
bvn13 2026-03-22 19:51:19 +03:00
parent 2849e593bf
commit 35d439e910
2 changed files with 23 additions and 20 deletions

View File

@ -116,6 +116,10 @@ class CommandHandler:
# ------------------------------------------------------------------ # ------------------------------------------------------------------
async def _handle_room(self, msg) -> None: async def _handle_room(self, msg) -> None:
# Пропускаем исторические сообщения (XEP-0203), воспроизводимые при входе в комнату
if msg["delay"]["stamp"]:
return
room_jid = msg["from"].bare room_jid = msg["from"].bare
sender_nick = msg["from"].resource sender_nick = msg["from"].resource
body = msg["body"].strip() if msg["body"] else "" body = msg["body"].strip() if msg["body"] else ""
@ -208,7 +212,9 @@ class CommandHandler:
room = await self._room_repo.get(room_jid) room = await self._room_repo.get(room_jid)
if not room: if not room:
return False return False
return room.admin_jid == caller_jid # Сравниваем bare JID — реальный JID из MUC может содержать ресурс
caller_bare = caller_jid.split("/")[0]
return room.admin_jid == caller_bare
def _get_real_jid(self, room_jid: str, nick: str) -> str | None: def _get_real_jid(self, room_jid: str, nick: str) -> str | None:
"""Получает реальный JID участника MUC через resolver.""" """Получает реальный JID участника MUC через resolver."""

View File

@ -28,8 +28,7 @@ class JabberConnection(ClientXMPP, JabberRoomJoiner, JabberRoomLeaver, MucJidRes
self.register_plugin("xep_0199") # XMPP Ping self.register_plugin("xep_0199") # XMPP Ping
self.add_event_handler("session_start", self._on_session_start) self.add_event_handler("session_start", self._on_session_start)
self.add_event_handler("message", self._on_chat_message) self.add_event_handler("message", self._on_message)
self.add_event_handler("groupchat_message", self._on_groupchat_message)
self.add_event_handler("failed_auth", self._on_failed_auth) self.add_event_handler("failed_auth", self._on_failed_auth)
def set_message_callback(self, callback: MessageCallback) -> None: def set_message_callback(self, callback: MessageCallback) -> None:
@ -52,28 +51,26 @@ class JabberConnection(ClientXMPP, JabberRoomJoiner, JabberRoomLeaver, MucJidRes
except Exception: except Exception:
logger.exception("Не удалось зайти в комнату %s при старте", room_jid) logger.exception("Не удалось зайти в комнату %s при старте", room_jid)
async def _on_chat_message(self, msg) -> None: async def _on_message(self, msg) -> None:
"""Обрабатывает только личные сообщения (type=chat).""" mtype = msg["type"]
if msg["type"] != "chat": if mtype == "chat":
return # Игнорируем собственные личные сообщения
if msg["from"].bare == self.boundjid.bare: if msg["from"].bare == self.boundjid.bare:
return return
if self._message_callback is not None: elif mtype == "groupchat":
try: # Игнорируем собственные сообщения, отражённые сервером из комнаты
await self._message_callback(msg)
except Exception:
logger.exception("Ошибка в обработчике личных сообщений")
async def _on_groupchat_message(self, msg) -> None:
"""Обрабатывает сообщения в конференции (type=groupchat)."""
# Игнорируем собственные сообщения, отражённые сервером
if msg["from"].resource == self._nick: if msg["from"].resource == self._nick:
return return
else:
return
logger.debug("Входящее сообщение type=%s from=%s", mtype, msg["from"])
if self._message_callback is not None: if self._message_callback is not None:
try: try:
await self._message_callback(msg) await self._message_callback(msg)
except Exception: except Exception:
logger.exception("Ошибка в обработчике сообщений конференции") logger.exception("Ошибка в обработчике сообщений")
async def _on_failed_auth(self, event) -> None: async def _on_failed_auth(self, event) -> None:
logger.error("Ошибка аутентификации XMPP") logger.error("Ошибка аутентификации XMPP")
@ -88,7 +85,7 @@ class JabberConnection(ClientXMPP, JabberRoomJoiner, JabberRoomLeaver, MucJidRes
async def leave_room(self, room_jid: str) -> None: async def leave_room(self, room_jid: str) -> None:
muc = self.plugin["xep_0045"] muc = self.plugin["xep_0045"]
await muc.leave_muc(room_jid, self._nick) muc.leave_muc(room_jid, self._nick)
logger.info("Вышел из комнаты %s", room_jid) logger.info("Вышел из комнаты %s", room_jid)
# --- Вспомогательные методы для адаптеров --- # --- Вспомогательные методы для адаптеров ---