point_settings.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from __future__ import annotations
  2. from typing import Any
  3. from pyrogram.types import KeyboardButton, ReplyKeyboardMarkup, ReplyKeyboardRemove
  4. from wbb import app
  5. from wbb.utils.dbpoints import (
  6. PointsError,
  7. get_point_rules,
  8. normalize_point_rules,
  9. set_point_rules,
  10. )
  11. CHECKIN_BUTTON_TEXT = "签到"
  12. def checkin_button_active(rules: dict[str, Any]) -> bool:
  13. return bool(
  14. rules.get("enabled")
  15. and rules.get("checkin_enabled")
  16. and rules.get("checkin_button_enabled")
  17. )
  18. def checkin_keyboard() -> ReplyKeyboardMarkup:
  19. return ReplyKeyboardMarkup(
  20. [[KeyboardButton(CHECKIN_BUTTON_TEXT)]],
  21. is_persistent=False,
  22. resize_keyboard=True,
  23. one_time_keyboard=True,
  24. selective=False,
  25. placeholder="输入消息",
  26. )
  27. async def _sync_checkin_keyboard(chat_id: int, enabled: bool) -> None:
  28. if enabled:
  29. text = "签到快捷按钮已开启。点击下方“签到”即可领取每日积分。"
  30. reply_markup = checkin_keyboard()
  31. else:
  32. text = "签到快捷按钮已关闭。"
  33. reply_markup = ReplyKeyboardRemove(selective=False)
  34. try:
  35. await app.send_message(chat_id, text, reply_markup=reply_markup)
  36. except Exception as exc:
  37. raise PointsError(
  38. "无法更新群底部签到按钮,请确认机器人可以在群内发言。"
  39. ) from exc
  40. async def apply_point_rules(chat_id: int, values: dict[str, Any]) -> dict[str, Any]:
  41. current = await get_point_rules(chat_id)
  42. target = normalize_point_rules({**current, **values})
  43. current_active = checkin_button_active(current)
  44. target_active = checkin_button_active(target)
  45. saved = await set_point_rules(chat_id, target)
  46. if current_active == target_active:
  47. return saved
  48. try:
  49. await _sync_checkin_keyboard(chat_id, target_active)
  50. except Exception:
  51. await set_point_rules(chat_id, current)
  52. raise
  53. return saved