rss.py 2.9 KB

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