X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FOStatus%2FOStatusPlugin.php;h=b6c9fa1d4c28b2439255f1af31d6f3f657eaf482;hb=3cb6b1670bd7e3860fdca217e4075f51378fe5e0;hp=f7fed1f0db130938056ac77e3d90da0e0716332d;hpb=46f90f7b08381eec80c2e895d061af15b5e1c729;p=quix0rs-gnu-social.git diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index f7fed1f0db..b6c9fa1d4c 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -63,9 +63,9 @@ class OStatusPlugin extends Plugin $m->connect('main/ostatus?nickname=:nickname', array('action' => 'ostatusinit'), array('nickname' => '[A-Za-z0-9_-]+')); $m->connect('main/ostatussub', - array('action' => 'ostatussub')); + array('action' => 'ostatussub')); $m->connect('main/ostatussub', - array('action' => 'ostatussub'), array('feed' => '[A-Za-z0-9\.\/\:]+')); + array('action' => 'ostatussub'), array('feed' => '[A-Za-z0-9\.\/\:]+')); // PuSH actions $m->connect('main/push/hub', array('action' => 'pushhub')); @@ -80,6 +80,9 @@ class OStatusPlugin extends Plugin $m->connect('main/salmon/user/:id', array('action' => 'salmon'), array('id' => '[0-9]+')); + $m->connect('main/salmon/group/:id', + array('action' => 'salmongroup'), + array('id' => '[0-9]+')); return true; } @@ -109,24 +112,34 @@ class OStatusPlugin extends Plugin * Set up a PuSH hub link to our internal link for canonical timeline * Atom feeds for users and groups. */ - function onStartApiAtom(Action $action) + function onStartApiAtom(AtomNoticeFeed $feed) { - if ($action instanceof ApiTimelineUserAction || $action instanceof ApiTimelineGroupAction) { - $id = $action->arg('id'); - if (strval(intval($id)) === strval($id)) { - // Canonical form of id in URL? - // Updates will be handled for our internal PuSH hub. - $action->element('link', array('rel' => 'hub', - 'href' => common_local_url('pushhub'))); - - // Also, we'll add in the salmon link - $action->element('link', array('rel' => 'salmon', - 'href' => common_local_url('salmon'))); + $id = null; + + if ($feed instanceof AtomUserNoticeFeed) { + $salmonAction = 'salmon'; + $id = $feed->getUser()->id; + } else if ($feed instanceof AtomGroupNoticeFeed) { + $salmonAction = 'salmongroup'; + $id = $feed->getGroup()->id; + } else { + return; + } + + if (!empty($id)) { + $hub = common_config('ostatus', 'hub'); + if (empty($hub)) { + // Updates will be handled through our internal PuSH hub. + $hub = common_local_url('pushhub'); } + $feed->addLink($hub, array('rel' => 'hub')); + + // Also, we'll add in the salmon link + $salmon = common_local_url($salmonAction, array('id' => $id)); + $feed->addLink($salmon, array('rel' => 'salmon')); } - return true; } - + /** * Add the feed settings page to the Connect Settings menu * @@ -175,7 +188,7 @@ class OStatusPlugin extends Plugin /** * Add in an OStatus subscribe button */ - function onStartProfilePageActionsElements($output, $profile) + function onStartProfileRemoteSubscribe($output, $profile) { $cur = common_current_user(); @@ -186,63 +199,107 @@ class OStatusPlugin extends Plugin array('nickname' => $profile->nickname)); $output->element('a', array('href' => $url, 'class' => 'entity_remote_subscribe'), - _('OStatus')); - + _m('Subscribe')); + $output->elementEnd('li'); } + + return false; } /** - * Check if we've got some Salmon stuff to send + * Check if we've got remote replies to send via Salmon. + * + * @fixme push webfinger lookup & sending to a background queue + * @fixme also detect short-form name for remote subscribees where not ambiguous */ function onEndNoticeSave($notice) { $count = preg_match_all('/(\w+\.)*\w+@(\w+\.)*\w+(\w+\-\w+)*\.\w+/', $notice->content, $matches); if ($count) { foreach ($matches[0] as $webfinger) { + + // FIXME: look up locally first + // Check to see if we've got an actual webfinger $w = new Webfinger; $endpoint_uri = ''; - + $result = $w->lookup($webfinger); if (empty($result)) { continue; } - + foreach ($result->links as $link) { if ($link['rel'] == 'salmon') { $endpoint_uri = $link['href']; } } - + if (empty($endpoint_uri)) { continue; } - $profile = $notice->getProfile(); - - $acct = $profile->nickname .'@'. common_config('site', 'server'); - + // FIXME: this needs to go out in a queue handler + $xml = ''; $xml .= $notice->asAtomEntry(); - // TODO : need to set author/uri to webfinger acct. more cleanly - $xml = preg_replace('/([^<])*<\/uri>/i', 'acct:'.$acct.'', $xml); - $salmon = new Salmon(); $salmon->post($endpoint_uri, $xml); } } } - - + + /** + * Garbage collect unused feeds on unsubscribe + */ + function onEndUnsubscribe($user, $other) + { + $profile = Ostatus_profile::staticGet('profile_id', $other->id); + if ($feed) { + $sub = new Subscription(); + $sub->subscribed = $other->id; + $sub->limit(1); + if (!$sub->find(true)) { + common_log(LOG_INFO, "Unsubscribing from now-unused feed $feed->feeduri on hub $feed->huburi"); + $profile->unsubscribe(); + } + } + return true; + } + + /** + * Make sure necessary tables are filled out. + */ function onCheckSchema() { - // warning: the autoincrement doesn't seem to set. - // alter table feedinfo change column id id int(11) not null auto_increment; $schema = Schema::get(); - $schema->ensureTable('feedinfo', Feedinfo::schemaDef()); + $schema->ensureTable('ostatus_profile', Ostatus_profile::schemaDef()); $schema->ensureTable('hubsub', HubSub::schemaDef()); return true; - } + } + + function onEndShowStatusNetStyles($action) { + $action->cssLink(common_path('plugins/OStatus/theme/base/css/ostatus.css')); + return true; + } + + function onEndShowStatusNetScripts($action) { + $action->script(common_path('plugins/OStatus/js/ostatus.js')); + return true; + } + + function onStartNoticeSourceLink($notice, &$name, &$url, &$title) + { + if ($notice->source == 'ostatus') { + $bits = parse_url($notice->uri); + $domain = $bits['host']; + + $name = $domain; + $url = $notice->uri; + $title = sprintf(_m("Sent from %s via OStatus"), $domain); + return false; + } + } }