point_settings.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from __future__ import annotations
  2. from typing import Any
  3. from pyrogram.types import KeyboardButton, ReplyKeyboardMarkup, ReplyKeyboardRemove
  4. from wbb import app, log
  5. from wbb.services.message_cleanup import schedule_group_cleanup
  6. from wbb.utils.dbpoints import (
  7. PointsError,
  8. get_point_rules,
  9. list_checkin_keyboard_migrations,
  10. mark_checkin_keyboard_version,
  11. normalize_point_rules,
  12. set_point_rules,
  13. )
  14. CHECKIN_BUTTON_TEXT = "签到"
  15. CHECKIN_KEYBOARD_VERSION = 1
  16. def checkin_button_active(rules: dict[str, Any]) -> bool:
  17. return bool(
  18. rules.get("enabled")
  19. and rules.get("checkin_enabled")
  20. and rules.get("checkin_button_enabled")
  21. )
  22. def checkin_keyboard() -> ReplyKeyboardMarkup:
  23. return ReplyKeyboardMarkup(
  24. [[KeyboardButton(CHECKIN_BUTTON_TEXT)]],
  25. is_persistent=False,
  26. resize_keyboard=True,
  27. one_time_keyboard=True,
  28. selective=False,
  29. placeholder="输入消息",
  30. )
  31. async def _sync_checkin_keyboard(chat_id: int, enabled: bool) -> None:
  32. messages = []
  33. try:
  34. if enabled:
  35. messages.append(
  36. await app.send_message(
  37. chat_id,
  38. "正在更新签到快捷按钮。",
  39. reply_markup=ReplyKeyboardRemove(selective=False),
  40. )
  41. )
  42. messages.append(
  43. await app.send_message(
  44. chat_id,
  45. "签到快捷按钮已开启。点击下方“签到”即可领取每日积分。",
  46. reply_markup=checkin_keyboard(),
  47. )
  48. )
  49. else:
  50. messages.append(
  51. await app.send_message(
  52. chat_id,
  53. "签到快捷按钮已关闭。",
  54. reply_markup=ReplyKeyboardRemove(selective=False),
  55. )
  56. )
  57. except Exception as exc:
  58. raise PointsError(
  59. "无法更新群底部签到按钮,请确认机器人可以在群内发言。"
  60. ) from exc
  61. schedule_group_cleanup(*messages)
  62. async def refresh_active_checkin_keyboards() -> int:
  63. chat_ids = await list_checkin_keyboard_migrations(CHECKIN_KEYBOARD_VERSION)
  64. refreshed = 0
  65. for chat_id in chat_ids:
  66. try:
  67. await _sync_checkin_keyboard(chat_id, True)
  68. await mark_checkin_keyboard_version(
  69. chat_id,
  70. CHECKIN_KEYBOARD_VERSION,
  71. )
  72. refreshed += 1
  73. except Exception as exc:
  74. log.error(f"刷新群 {chat_id} 的签到快捷按钮失败:{exc}")
  75. return refreshed
  76. async def apply_point_rules(chat_id: int, values: dict[str, Any]) -> dict[str, Any]:
  77. current = await get_point_rules(chat_id)
  78. target = normalize_point_rules({**current, **values})
  79. current_active = checkin_button_active(current)
  80. target_active = checkin_button_active(target)
  81. saved = await set_point_rules(chat_id, target)
  82. if current_active == target_active:
  83. return saved
  84. try:
  85. await _sync_checkin_keyboard(chat_id, target_active)
  86. if target_active:
  87. await mark_checkin_keyboard_version(
  88. chat_id,
  89. CHECKIN_KEYBOARD_VERSION,
  90. )
  91. except Exception:
  92. await set_point_rules(chat_id, current)
  93. raise
  94. return saved