channels.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. from __future__ import annotations
  2. import asyncio
  3. from pyrogram import filters
  4. from pyrogram.enums import ChatMemberStatus, ChatType
  5. from wbb import BOT_ID, BOT_PERMISSIONS, app, log
  6. from wbb.services.bot_permissions import has_permission
  7. from wbb.services.channel_management import (
  8. ensure_channel,
  9. observe_channel_deletion,
  10. observe_channel_post,
  11. sweep_channel_posts,
  12. )
  13. from wbb.utils.dbadmin import mark_managed_chat_unavailable
  14. _sweeper_started = False
  15. @app.on_message(filters.channel, group=-29)
  16. async def collect_channel_post(_, message):
  17. if not has_permission("channel.posts", BOT_PERMISSIONS):
  18. return
  19. try:
  20. await observe_channel_post(message)
  21. except Exception as exc:
  22. log.error(f"频道帖子采集失败:{exc}")
  23. @app.on_edited_message(filters.channel, group=-29)
  24. async def collect_edited_channel_post(_, message):
  25. if not has_permission("channel.posts", BOT_PERMISSIONS):
  26. return
  27. try:
  28. await observe_channel_post(message)
  29. except Exception as exc:
  30. log.error(f"频道帖子编辑采集失败:{exc}")
  31. @app.on_deleted_messages(filters.channel, group=-29)
  32. async def collect_deleted_channel_posts(_, messages):
  33. if not has_permission("channel.posts", BOT_PERMISSIONS):
  34. return
  35. for message in messages:
  36. chat_id = int(getattr(getattr(message, "chat", None), "id", 0) or 0)
  37. message_id = int(getattr(message, "id", 0) or 0)
  38. if chat_id and message_id:
  39. await observe_channel_deletion(chat_id, message_id)
  40. @app.on_chat_member_updated(filters.channel, group=-29)
  41. async def observe_channel_bot_membership(_, update):
  42. member = update.new_chat_member or update.old_chat_member
  43. if (
  44. getattr(update.chat, "type", None) != ChatType.CHANNEL
  45. or not member
  46. or getattr(member.user, "id", None) != BOT_ID
  47. ):
  48. return
  49. if update.new_chat_member and update.new_chat_member.status in {
  50. ChatMemberStatus.OWNER,
  51. ChatMemberStatus.ADMINISTRATOR,
  52. }:
  53. try:
  54. await ensure_channel(int(update.chat.id))
  55. except Exception as exc:
  56. log.error(f"频道自动登记失败:{exc}")
  57. else:
  58. await mark_managed_chat_unavailable(int(update.chat.id), "Bot is no longer a channel admin")
  59. async def _sweep_loop() -> None:
  60. await asyncio.sleep(5)
  61. while True:
  62. try:
  63. await sweep_channel_posts()
  64. except Exception as exc:
  65. log.error(f"频道定时发布失败:{exc}")
  66. await asyncio.sleep(15)
  67. def _start_sweeper() -> None:
  68. global _sweeper_started
  69. if _sweeper_started:
  70. return
  71. try:
  72. loop = asyncio.get_running_loop()
  73. except RuntimeError:
  74. return
  75. _sweeper_started = True
  76. loop.create_task(_sweep_loop(), name="channel-post-sweeper")
  77. _start_sweeper()