microblog.pub/core/tasks.py

118 lines
3.5 KiB
Python
Raw Normal View History

2019-07-04 21:23:40 +00:00
import os
2019-07-07 15:48:45 +00:00
from datetime import datetime
from datetime import timezone
2019-08-17 08:27:20 +00:00
from typing import Any
from typing import Dict
2019-09-08 10:09:34 +00:00
from typing import Set
2019-07-07 15:48:45 +00:00
2019-08-20 20:16:47 +00:00
from little_boxes import activitypub as ap
2019-07-04 21:23:40 +00:00
from poussetaches import PousseTaches
2019-08-01 17:55:30 +00:00
from config import MEDIA_CACHE
2019-07-12 22:38:51 +00:00
from utils import parse_datetime
2019-07-04 21:23:40 +00:00
p = PousseTaches(
os.getenv("MICROBLOGPUB_POUSSETACHES_HOST", "http://localhost:7991"),
os.getenv("MICROBLOGPUB_INTERNAL_HOST", "http://localhost:5000"),
)
class Tasks:
@staticmethod
def cache_object(iri: str) -> None:
p.push(iri, "/task/cache_object")
@staticmethod
def cache_actor(iri: str, also_cache_attachments: bool = True) -> None:
p.push(
{"iri": iri, "also_cache_attachments": also_cache_attachments},
"/task/cache_actor",
)
2019-08-11 10:07:30 +00:00
@staticmethod
def cache_actor_icon(icon_url: str, actor_iri: str) -> None:
if MEDIA_CACHE.is_actor_icon_cached(icon_url):
return None
2019-08-20 20:16:47 +00:00
@staticmethod
def cache_emoji(url: str, iri: str) -> None:
if MEDIA_CACHE.is_emoji_cached(iri):
return None
p.push({"url": url, "iri": iri}, "/task/cache_emoji")
@staticmethod
2019-09-08 10:09:34 +00:00
def send_webmentions(activity: ap.Create, links: Set[str]) -> None:
for link in links:
p.push(
{
"link": link,
"note_url": activity.get_object().get_url(),
"remote_id": activity.id,
},
"/task/send_webmention",
)
@staticmethod
2019-08-20 20:16:47 +00:00
def cache_emojis(activity: ap.BaseActivity) -> None:
for emoji in activity.get_emojis():
try:
Tasks.cache_emoji(emoji.get_icon_url(), emoji.id)
except KeyError:
# TODO(tsileo): log invalid emoji
pass
2019-08-11 10:07:30 +00:00
2019-07-04 21:23:40 +00:00
@staticmethod
def post_to_remote_inbox(payload: str, recp: str) -> None:
p.push({"payload": payload, "to": recp}, "/task/post_to_remote_inbox")
@staticmethod
def forward_activity(iri: str) -> None:
p.push(iri, "/task/forward_activity")
@staticmethod
def fetch_og_meta(iri: str) -> None:
p.push(iri, "/task/fetch_og_meta")
@staticmethod
def process_reply(iri: str) -> None:
p.push(iri, "/task/process_reply")
2019-07-04 21:23:40 +00:00
@staticmethod
def process_new_activity(iri: str) -> None:
p.push(iri, "/task/process_new_activity")
@staticmethod
def cache_attachments(iri: str) -> None:
p.push(iri, "/task/cache_attachments")
2019-08-17 08:27:20 +00:00
@staticmethod
def cache_attachment(attachment: Dict[str, Any], iri: str) -> None:
p.push({"iri": iri, "attachment": attachment}, "/task/cache_attachment")
2019-07-04 21:23:40 +00:00
@staticmethod
def finish_post_to_inbox(iri: str) -> None:
p.push(iri, "/task/finish_post_to_inbox")
@staticmethod
def finish_post_to_outbox(iri: str) -> None:
p.push(iri, "/task/finish_post_to_outbox")
@staticmethod
def update_question_outbox(iri: str, open_for: int) -> None:
p.push(
iri, "/task/update_question", delay=open_for
) # XXX: delay expects minutes
@staticmethod
2019-07-07 15:48:45 +00:00
def fetch_remote_question(question) -> None:
now = datetime.now(timezone.utc)
2019-07-12 20:03:04 +00:00
dt = parse_datetime(question.closed or question.endTime)
2019-07-07 15:48:45 +00:00
minutes = int((dt - now).total_seconds() / 60)
2019-07-07 15:50:28 +00:00
if minutes > 0:
# Only push the task if the poll is not ended yet
p.push(
question.id, "/task/fetch_remote_question", delay=minutes
) # XXX: delay expects minutes