import os
import tempfile
import requests
from celery.schedules import crontab
from django.conf import settings
from django.utils import timezone
from ..signalbot import rpc
from ..telegrambot import rpc as telegram_rpc
from ..celery import app
from . import models
@app.task(queue="default", ignore_results=True)
def announce_items():
if not getattr(settings, 'SIGNAL_ANNOUNCE_GROUP'):
return
now = timezone.now()
qs = models.Item.objects.exclude(published=None).filter(announced=None).filter(published__lte=now).order_by('published')
for item in qs:
item.announced = now
link = settings.BASE_URL + item.get_absolute_url()
message = link
image = item.data.get('thumbnail')
description = ""
if image:
f = tempfile.NamedTemporaryFile(suffix=".jpg", delete=False)
r = requests.get(image)
f.write(r.content)
f.close()
image = f.name
if getattr(settings, "SIGNAL_ANNOUNCE_GROUP"):
r = rpc.send(
message,
group=settings.SIGNAL_ANNOUNCE_GROUP,
preview_url=link,
preview_title=item.title,
preview_image=image,
preview_description=description,
)
if getattr(settings, "TELEGRAM_ANNOUNCE_CHANNEL"):
message = f'{item.title}\n{link}'
r = telegram_rpc.send(
message,
channel=settings.TELEGRAM_ANNOUNCE_CHANNEL,
preview_image=image,
)
item.save()
if image:
os.unlink(f.name)
@app.task(queue="default", ignore_results=True)
def notify_telegram(message):
if getattr(settings, "TELEGRAM_ANNOUNCE_CHANNEL"):
r = telegram_rpc.send(
message,
channel=settings.TELEGRAM_ANNOUNCE_CHANNEL
)
@app.task(queue="default", ignore_results=True)
def notify_moderators(id, link):
comment = models.Comment.objects.filter(id=id).first()
if comment:
message = "%s commented on %s (%s)\n\n%s" % (
comment.name, comment.item.title, link, comment.text
)
r = rpc.send(message, group=settings.SIGNAL_MODERATORS_GROUP)
if r and "timestamp" in r:
comment.data["moderator_ts"] = r["timestamp"]
comment.save()
if comment.published:
account = settings.SIGNAL_ACCOUNT
group = settings.SIGNAL_MODERATORS_GROUP
rpc.send_reaction(
account, comment.data["moderator_ts"], "🎉", group=group
)
msg = '%s commented on %s at %s' % (
comment.name, comment.item.title, link, link
)
notify_telegram.delay(msg)
else:
print("failed to notify", r)
@app.on_after_finalize.connect
def setup_periodic_tasks(sender, **kwargs):
sender.add_periodic_task(crontab(minute="*/2"), announce_items.s())