telegram_bots/feeds/tasks.py
2019-03-14 09:53:06 +03:00

56 lines
1.4 KiB
Python

import sentry_sdk
from celery.exceptions import Reject
from celery_once import QueueOnce
from django.utils import timezone
from telebot import TeleBot
from djconfig import config
from config.celery import app
@app.task(base=QueueOnce, once={'graceful': True})
def check_feeds():
from feeds.models import Feed
feeds = Feed.objects.filter(lock=False)
enqueued = []
for feed in feeds:
if feed.run_check():
enqueued.append(str(feed))
return f'Following tasks were enqueued: {enqueued}'
@app.task()
def execute_feed(feed_pk):
from feeds.models import Feed
config._reload_maybe()
feed = None
try:
feed = Feed.objects.get(pk=feed_pk)
if not feed.lock:
feed.lock = True
feed.save()
else:
raise Reject('Lock', requeue=False)
bot = TeleBot(config.feed_bot_token, threaded=False)
print(f'Last ID for "{feed}" = "{feed.last_id}"')
for last_id in feed.config.execute(bot, feed.chat_id, feed.last_id):
if last_id:
feed.last_id = last_id
feed.save()
print(f'Saved last ID for "{feed}" = "{feed.last_id}"')
bot.stop_bot()
feed.last_check = timezone.now()
feed.save()
except Exception as e:
sentry_sdk.capture_exception(e)
finally:
if feed:
feed.lock = False
feed.save()