From 85c1222b540d4e64d15a768a89d2817fd7e6a90b Mon Sep 17 00:00:00 2001 From: jesopo Date: Fri, 2 Aug 2019 15:57:53 +0100 Subject: add fediverse.py --- modules/fediverse.py | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 modules/fediverse.py (limited to 'modules') diff --git a/modules/fediverse.py b/modules/fediverse.py new file mode 100644 index 00000000..0851d9fc --- /dev/null +++ b/modules/fediverse.py @@ -0,0 +1,59 @@ +from src import ModuleManager, utils + +WEBFINGER = "https://%s/.well-known/webfinger" +WEBFINGER_HEADERS = {"Accept": "application/jrd+json"} + +ACTIVITY_TYPE = "application/activity+json" +ACTIVITY_HEADERS = {"Accept": ("application/ld+json; " + 'profile="https://www.w3.org/ns/activitystreams"')} + +class Module(ModuleManager.BaseModule): + _name = "Fedi" + + @utils.hook("received.command.fediverse") + @utils.hook("received.command.fedi", alias_of="fediverse") + @utils.kwarg("min_args", 1) + @utils.kwarg("help", "Get someone's latest toot") + @utils.kwarg("usage", "@@") + def fedi(self, event): + full_username = event["args_split"][0].lstrip("@") + username, _, instance = full_username.partition("@") + if not username or not instance: + raise utils.EventError("Please provide @@") + + webfinger = utils.http.request(WEBFINGER % instance, + headers=WEBFINGER_HEADERS, + get_params={"resource": "acct:%s" % full_username}, + json=True) + + if webfinger.data: + activity_url = None + for link in webfinger.data["links"]: + if link["type"] == ACTIVITY_TYPE: + activity_url = link["href"] + break + + if not activity_url: + raise utils.EventError("Failed to find user activity feed") + + activity = utils.http.request(activity_url, + headers=ACTIVITY_HEADERS, json=True) + preferred_username = activity.data["preferredUsername"] + outbox_url = activity.data["outbox"] + + outbox = utils.http.request(outbox_url, headers=ACTIVITY_HEADERS, + json=True) + if "first" in outbox.data: + outbox = utils.http.request(outbox.data["first"], + headers=ACTIVITY_HEADERS, json=True) + + items = outbox.data["orderedItems"] + if items: + first_item = items[0]["object"]["content"] + first_item = utils.http.strip_html(first_item) + url = items[0]["object"]["url"] + shorturl = self.exports.get_one("shorturl")( + event["server"], url) + + event["stdout"].write("%s: %s - %s" % (preferred_username, + first_item, shorturl)) -- cgit v1.3.1-10-gc9f91