diff options
| author | 2019-09-15 10:43:46 +0100 | |
|---|---|---|
| committer | 2019-09-15 10:43:46 +0100 | |
| commit | 54ee1b35946b587e85c8995ed10b9d5eecab802d (patch) | |
| tree | 9a28d65fd909bd74f848567b695c5fbb50b7658e /modules/fediverse/__init__.py | |
| parent | remove unneeded "`"s (diff) | |
| signature | ||
re-merge fediverse an fediverse_server, so they can share utils
Diffstat (limited to 'modules/fediverse/__init__.py')
| -rw-r--r-- | modules/fediverse/__init__.py | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/modules/fediverse/__init__.py b/modules/fediverse/__init__.py new file mode 100644 index 00000000..41e0bfe6 --- /dev/null +++ b/modules/fediverse/__init__.py @@ -0,0 +1,87 @@ +import urllib.parse +from src import IRCBot, ModuleManager, utils +from . import ap_actor, ap_utils + +def _format_username(username, instance): + return "@%s@%s" % (username, instance) +def _setting_parse(s): + username, instance = ap_utils.split_username(s) + if username and instance: + return _format_username(username, instance) + return None + +@utils.export("set", utils.FunctionSetting(_setting_parse, "fediverse", + help="Set your fediverse account", example="@gargron@mastodon.social")) +class Module(ModuleManager.BaseModule): + _name = "Fedi" + + @utils.hook("received.command.fediverse") + @utils.hook("received.command.fedi", alias_of="fediverse") + @utils.kwarg("help", "Get someone's latest toot") + @utils.kwarg("usage", "@<user>@<instance>") + def fedi(self, event): + account = None + if not event["args"]: + account = event["user"].get_setting("fediverse", None) + elif not "@" in event["args"]: + target = event["args_split"][0] + if event["server"].has_user_id(target): + target_user = event["server"].get_user(target) + account = target_user.get_setting("fediverse", None) + else: + account = event["args_split"][0] + + username = None + instance = None + if account: + username, instance = ap_utils.split_username(account) + + if not username or not instance: + raise utils.EventError("Please provide @<user>@<instance>") + + actor_url = ap_utils.find_actor(username, instance) + + if not actor_url: + raise utils.EventError("Failed to find actor") + + actor = ap_actor.Actor(actor_url) + actor.load() + items = actor.outbox.load() + + if not items: + raise utils.EventError("No toots found") + + first_item = items[0] + if first_item["type"] == "Announce": + retoot_url = first_item["object"] + retoot_instance = urllib.parse.urlparse(retoot_url).hostname + retoot = utils.http.request(retoot_url, + headers=ACTIVITY_HEADERS, json=True, useragent=USERAGENT) + + original_tooter = ap_actor.Actor(retoot.data["attributedTo"]) + original_tooter.load() + + original_tooter = utils.http.request(original_tooter_url, + headers=ACTIVITY_HEADERS, json=True, useragent=USERAGENT) + + retooted_user = "@%s@%s" % (original_tooter.username, + retoot_instance) + + shorturl = self.exports.get_one("shorturl")( + event["server"], retoot_url) + retoot_content = utils.http.strip_html( + retoot.data["content"]) + + event["stdout"].write("%s (boost %s): %s - %s" % ( + actor.username, retooted_user, retoot_content, + shorturl)) + + elif first_item["type"] == "Create": + content = utils.http.strip_html( + first_item["object"]["content"]) + url = first_item["object"]["id"] + shorturl = self.exports.get_one("shorturl")( + event["server"], url) + + event["stdout"].write("%s: %s - %s" % (actor.username, + content, shorturl)) |
