Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions DMShoot.spec
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ hiddenimports = [
"fontTools.subset",
"fontTools.ttLib",
"brotli",
# 抖音 SDK 的依赖:SDK 模块来自 external/(运行时才进 sys.path),
# PyInstaller 跟不进 dy_apis/douyin_api.py,必须显式声明,否则 exe 里照样缺模块
"google.protobuf",
"protobuf_to_dict",
"six",
]

# ── 数据文件 ──
Expand Down
35 changes: 35 additions & 0 deletions dmshoot/gui/pages/home_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from dmshoot.gui.widgets.contact import ContactList
from dmshoot.gui.quick_chat_view import ChatView
from dmshoot.gui.monitor_panel import MonitorPanel
from dmshoot.core.bus import PlatformStatus
from dmshoot.storage import database
from dmshoot.storage.models import SessionRecord

Expand Down Expand Up @@ -128,6 +129,37 @@ def _do_load_contacts(self):
else:
self.chat.show_placeholder(f"暂未连接 {pn}\n\n请前往左侧「登录」扫码连接平台")

# ── 平台自动跟随 ──

def _current_platform_has_sessions(self) -> bool:
"""当前平台是否已有会话。通讯录是节流加载的,所以以数据库为准。"""
if self.contacts.list.count() > 0:
return True
try:
return bool(database.get_sessions(self._current_platform))
except Exception:
return True # 查不出来时保守处理:宁可不切

def follow_platform_if_idle(self, platform: str) -> bool:
"""当前平台没有任何会话时,把首页切到刚连上/刚来消息的平台。

只解决「平台已连接、消息也进来了,界面却停在空平台」这种看起来像
「私信没通」的假象;用户正在看的平台只要已有会话就绝不打扰。
"""
if not platform or platform == self._current_platform:
return False
if not self.ruler.has_platform(platform):
return False
if self._current_platform_has_sessions():
return False
self.ruler.set_active(platform) # 触发 switched → _on_platform_switch → 重新加载通讯录
return True

def on_platform_status(self, platform: str, status: str, msg: str = ""):
"""平台真正握手成功(绿灯)时跟随过去;「已保存」这类状态不触发。"""
if str(status or "").strip().lower() == PlatformStatus.ONLINE:
self.follow_platform_if_idle(platform)

def _on_session_select(self, session_id: str, peer_name: str = "会话"):
self._current_session = session_id
database.reset_unread(session_id) # 进入会话时清零未读
Expand Down Expand Up @@ -201,6 +233,9 @@ def add_message(self, session_id: str, sender_name: str, content: str,
# 成功发送的消息仍可先乐观展示,失败回调再按 message_key 撤回。
if not send_ok:
return
# 别的平台来消息、而当前平台还没有任何会话 → 先把视图跟过去,
# 否则用户盯着空平台,会以为私信没收到。
self.follow_platform_if_idle(session_id.split(":", 1)[0])
from dmshoot.storage.models import ChatMessage
import time as _time
now = _time.time()
Expand Down
2 changes: 1 addition & 1 deletion dmshoot/gui/sidebar.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ def update_status(self, platform: str, status: str):
return
text = str(status or "")
lower = text.lower()
if (any(kw in text for kw in ["认证失败", "过期", "未登录", "Cookie", "失效"])
if (any(kw in text for kw in ["认证失败", "过期", "未登录", "Cookie", "失效", "依赖缺失"])
or any(kw in lower for kw in ["error", "failed", "unauthorized"])):
row.set_status("error", text)
elif any(kw in text for kw in ["重连", "断线恢复", "稍后重试", "重试间隔"]):
Expand Down
2 changes: 2 additions & 0 deletions dmshoot/gui/signal_wiring.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,7 @@ def connect_all(main_window, adapter_mgr, auth_ctrl):
mw.bus.session_updated.connect(mw.page_home.refresh_session)
mw.bus.platform_status.connect(auth_ctrl.on_platform_status)
mw.bus.platform_status.connect(mw.page_home.refresh_account_avatar)
# 平台真连上时,若当前平台还是空的就把首页跟过去,避免"看着空列表以为没收到私信"
mw.bus.platform_status.connect(mw.page_home.on_platform_status)
mw.bus.ai_response.connect(mw._on_ai_response)
mw.bus.log.connect(mw._on_bus_log)
Loading