交互处理全分支观测日志;点击者标识兜底 user_openid
This commit is contained in:
1 parent
3fed0b0db1
commit
37e44a512d
1 file changed
+21
-7
+21
-7
@@ -342,13 +342,24 @@ def setup(bot: Bot, cfg: AuthConfig) -> VerifyState:
|
||||
except ApiError as e:
|
||||
logger.debug(f"回应互动失败(可能为重复推送): {e}")
|
||||
|
||||
if inter.chat_type != 1 or not inter.group_openid or not inter.group_member_openid:
|
||||
# 个别事件可能缺 group_member_openid 而只有 user_openid,先记日志再兜底
|
||||
clicker = inter.group_member_openid or inter.user_openid
|
||||
logger.info(
|
||||
f"按钮点击: chat_type={inter.chat_type} "
|
||||
f"点击者=…{(clicker or '?')[-6:]} data={inter.button_data[:32]!r}"
|
||||
)
|
||||
if inter.chat_type != 1 or not inter.group_openid or not clicker:
|
||||
logger.warning(
|
||||
f"忽略非常规互动: chat_type={inter.chat_type}, "
|
||||
f"group={inter.group_openid}, clicker={clicker}"
|
||||
)
|
||||
return
|
||||
parsed = captcha.parse_button_data(inter.button_data)
|
||||
if parsed is None:
|
||||
logger.warning(f"按钮数据无法解析,已忽略: {inter.button_data!r}")
|
||||
return
|
||||
token, value = parsed
|
||||
key = pending_key(inter.group_openid, inter.group_member_openid)
|
||||
key = pending_key(inter.group_openid, clicker)
|
||||
|
||||
record = state.get(key)
|
||||
owner = state.get_by_token(token)
|
||||
@@ -357,36 +368,39 @@ def setup(bot: Bot, cfg: AuthConfig) -> VerifyState:
|
||||
# 点的是别人的当前题:无论点击者自己什么身份,计入乱点处罚
|
||||
if owner is not None and not is_subject:
|
||||
await _handle_foreign_click(
|
||||
api, cfg, foreign_clicks, inter.group_openid, inter.group_member_openid,
|
||||
api, cfg, foreign_clicks, inter.group_openid, clicker,
|
||||
event_id=event.event_id,
|
||||
)
|
||||
return
|
||||
|
||||
if record is None:
|
||||
if state.is_verified_recently(key, cfg.verified_trust_days):
|
||||
logger.info(f"已通过成员点击旧按钮,礼貌回复 (…{clicker[-6:]})")
|
||||
await _reply_text(api, inter.group_openid, "你已经通过验证啦,不用再答题~",
|
||||
event_id=event.event_id)
|
||||
else:
|
||||
# 旧题/已失效按钮,礼貌忽略不计处罚
|
||||
logger.info(f"点击已失效按钮,礼貌回复 (…{clicker[-6:]})")
|
||||
await _reply_text(api, inter.group_openid, "这道题不是给你的~",
|
||||
event_id=event.event_id,
|
||||
mention=inter.group_member_openid)
|
||||
mention=clicker)
|
||||
return
|
||||
if not is_subject:
|
||||
logger.info(f"被试者点击自己的旧题,提示换题 (…{clicker[-6:]})")
|
||||
await _reply_text(api, inter.group_openid, "这题已经被换掉啦,请回答最新一题",
|
||||
event_id=event.event_id)
|
||||
return
|
||||
|
||||
if value == record.answer:
|
||||
try:
|
||||
await set_member_mute(api, inter.group_openid, inter.group_member_openid, None)
|
||||
await set_member_mute(api, inter.group_openid, clicker, None)
|
||||
except ApiError as e:
|
||||
logger.warning(f"解除禁言失败(已通过验证,请手动解禁): {e}")
|
||||
state.pop(key)
|
||||
state.mark_verified(key)
|
||||
await _reply_text(api, inter.group_openid, "验证通过,已解除禁言,欢迎加入本群!",
|
||||
event_id=event.event_id)
|
||||
logger.info(f"成员 …{inter.group_member_openid[-6:]} 验证通过")
|
||||
logger.info(f"成员 …{clicker[-6:]} 验证通过")
|
||||
else:
|
||||
cap = captcha.generate(cfg.captcha_options)
|
||||
# 换题但保留原截止时间:限时自进群起算
|
||||
@@ -402,7 +416,7 @@ def setup(bot: Bot, cfg: AuthConfig) -> VerifyState:
|
||||
await _reply_captcha(api, inter.group_openid, captcha.retry_markdown(cap),
|
||||
cap.keyboard(), event_id=event.event_id or "")
|
||||
except ApiError as e:
|
||||
logger.warning(f"换题发送失败 (…{inter.group_member_openid[-6:]}): {e}")
|
||||
logger.warning(f"换题发送失败 (…{clicker[-6:]}): {e}")
|
||||
|
||||
# ---------- 退群:清理 ----------
|
||||
|
||||
|
||||
Reference in new issue
Block a user