rss.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. from asyncio import get_event_loop, sleep
  2. from pyrogram import filters
  3. from pyrogram.types import Message
  4. from wbb import RSS_DELAY, app
  5. from wbb.core.decorators.errors import capture_err
  6. from wbb.utils.dbfunctions import (add_rss_feed, get_rss_feeds, is_rss_active,
  7. remove_rss_feed, update_rss_feed)
  8. from wbb.utils.functions import get_http_status_code, get_urls_from_text
  9. from wbb.utils.rss import Feed
  10. __MODULE__ = "RSS"
  11. __HELP__ = f"""
  12. /add_feed [URL] - Add a feed to chat
  13. /rm_feed - Remove feed from chat
  14. **Note:**
  15. - This will check for updates every {RSS_DELAY//60} minutes.
  16. - You can only add one feed per chat.
  17. - Currently RSS and ATOM feeds are supported.
  18. """
  19. async def rss_worker():
  20. print("[INFO]: RSS WORKER STARTED")
  21. while True:
  22. feeds = await get_rss_feeds()
  23. if not feeds:
  24. await sleep(RSS_DELAY)
  25. continue
  26. for _feed in feeds:
  27. try:
  28. chat = _feed["chat_id"]
  29. url = _feed["url"]
  30. last_title = _feed.get("last_title")
  31. feed = Feed(url)
  32. if feed.title == last_title:
  33. continue
  34. await app.send_message(
  35. chat, feed.parsed(), disable_web_page_preview=True
  36. )
  37. await update_rss_feed(chat, feed.title)
  38. except Exception as e:
  39. print(str(e), f"RSS {chat}")
  40. pass
  41. await sleep(RSS_DELAY)
  42. loop = get_event_loop()
  43. loop.create_task(rss_worker())
  44. @app.on_message(filters.command("add_feed"))
  45. @capture_err
  46. async def add_feed_func(_, m: Message):
  47. if len(m.command) != 2:
  48. return await m.reply("Read 'RSS' section in help menu.")
  49. url = m.text.split(None, 1)[1].strip()
  50. if not url:
  51. return await m.reply("[ERROR]: Invalid Argument")
  52. urls = get_urls_from_text(url)
  53. if not urls:
  54. return await m.reply("[ERROR]: Invalid URL")
  55. url = urls[0]
  56. status = await get_http_status_code(url)
  57. if status != 200:
  58. return await m.reply("[ERROR]: Invalid Url")
  59. ns = "[ERROR]: This feed isn't supported."
  60. try:
  61. feed = Feed(url)
  62. except Exception:
  63. return await m.reply(ns)
  64. if not feed:
  65. return await m.reply(ns)
  66. chat_id = m.chat.id
  67. if await is_rss_active(chat_id):
  68. return await m.reply("[ERROR]: You already have an RSS feed enabled.")
  69. try:
  70. await m.reply(feed.parsed(), disable_web_page_preview=True)
  71. except Exception:
  72. return await m.reply(ns)
  73. await add_rss_feed(chat_id, feed.url, feed.title)
  74. @app.on_message(filters.command("rm_feed"))
  75. async def rm_feed_func(_, m: Message):
  76. if await is_rss_active(m.chat.id):
  77. await remove_rss_feed(m.chat.id)
  78. await m.reply("Removed RSS Feed")
  79. else:
  80. await m.reply("There are no active RSS Feeds in this chat.")