irc: add unfollow command

This commit is contained in:
William Pitcock 2018-08-17 20:03:46 -05:00
parent 94d4efbe11
commit 4495aec088
2 changed files with 34 additions and 2 deletions

View File

@ -101,6 +101,27 @@ async def follow_remote_actor(actor_uri):
await push_message_to_actor(actor, message, "https://{}/actor#main-key".format(AP_CONFIG['host'])) await push_message_to_actor(actor, message, "https://{}/actor#main-key".format(AP_CONFIG['host']))
async def unfollow_remote_actor(actor_uri):
logging.info('unfollowing: %r', actor_uri)
actor = await fetch_actor(actor_uri)
message = {
"@context": "https://www.w3.org/ns/activitystreams",
"type": "Undo",
"to": [actor['id']],
"object": {
"type": "Follow",
"object": actor_uri,
"actor": actor['id'],
"id": "https://{}/activities/{}".format(AP_CONFIG['host'], uuid.uuid4()),
}
"id": "https://{}/activities/{}".format(AP_CONFIG['host'], uuid.uuid4()),
"actor": "https://{}/actor".format(AP_CONFIG['host'])
}
await push_message_to_actor(actor, message, "https://{}/actor#main-key".format(AP_CONFIG['host']))
tag_re = re.compile(r'(<!--.*?-->|<[^>]*>)') tag_re = re.compile(r'(<!--.*?-->|<[^>]*>)')
def strip_html(data): def strip_html(data):
no_tags = tag_re.sub('', data) no_tags = tag_re.sub('', data)

View File

@ -5,11 +5,12 @@ import base64
from blinker import signal from blinker import signal
from . import CONFIG from . import CONFIG
from .actor import follow_remote_actor from .actor import follow_remote_actor, unfollow_remote_actor
from .irc_envelope import RFC1459Message from .irc_envelope import RFC1459Message
from .authreqs import new_auth_req, set_irc_bot, check_auth, fetch_auth, drop_auth from .authreqs import new_auth_req, set_irc_bot, check_auth, fetch_auth, drop_auth
IRC_CONFIG = CONFIG.get('irc', {}) IRC_CONFIG = CONFIG.get('irc', {})
AP_CONFIG = CONFIG.get('irc', {'host': 'localhost'})
# SASL_PAYLOAD = base64.b64encode(b'\x00'.join([IRC_CONFIG['sasl_username'], IRC_CONFIG['sasl_username'], IRC_CONFIG['sasl_password']])) # SASL_PAYLOAD = base64.b64encode(b'\x00'.join([IRC_CONFIG['sasl_username'], IRC_CONFIG['sasl_username'], IRC_CONFIG['sasl_password']]))
@ -127,9 +128,19 @@ class IRCProtocol(asyncio.Protocol):
if not data: if not data:
return return
if data not in IRC_CONFIG['privileged']: if data not in IRC_CONFIG['privileged']:
self.say(nickname, "Access denied: \x02{0}\x02 is unprivileged.".format(data))
return return
logging.info('allowed follow: %r', action['follow']) logging.info('allowed follow: %r', action['follow'])
self.follow(nickname, action['follow']) self.follow(nickname, action['follow'])
elif 'unfollow' in action:
data = fetch_auth(account)
if not data:
return
if data not in IRC_CONFIG['privileged']:
self.say(nickname, "Access denied: \x02{0}\x02 is unprivileged.".format(data))
return
logging.info('allowed unfollow: %r', action['follow'])
self.follow(nickname, action['follow'])
def handle_auth_req(self, req): def handle_auth_req(self, req):
self.say(req.irc_nickname, "The actor \x02{0}\x02 is now linked to the IRC account \x02{1}\x02.".format(req.actor, req.irc_account)) self.say(req.irc_nickname, "The actor \x02{0}\x02 is now linked to the IRC account \x02{1}\x02.".format(req.actor, req.irc_account))
@ -152,7 +163,7 @@ class IRCProtocol(asyncio.Protocol):
if not check_auth(account) and not self.pending_whois(nickname, True): if not check_auth(account) and not self.pending_whois(nickname, True):
auth = new_auth_req(nickname, account) auth = new_auth_req(nickname, account)
self.say(nickname, "Authentication is required for this action. In order to prove your identity, you need to send me a token via the fediverse.") self.say(nickname, "Authentication is required for this action. In order to prove your identity, you need to send me a token via the fediverse.")
self.say(nickname, "On most platforms, posting like this will work: \x02@viera@viera.dereferenced.org {}\x02".format(auth)) self.say(nickname, "On most platforms, posting like this will work: \x02@viera@{1} {0}\x02".format(auth, AP_CONFIG['host']))
self.say(nickname, "This token is ephemeral, so you can send it to me publicly if your platform does not support direct messages.") self.say(nickname, "This token is ephemeral, so you can send it to me publicly if your platform does not support direct messages.")
else: else:
self.process_pending_action(nickname, account) self.process_pending_action(nickname, account)