X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FBitlyUrl%2FBitlyUrlPlugin.php;h=38c821636107bc2f21350707d7603d16ec4f9f20;hb=3f28b17c86c4cd88d4f39629ea8a89ec3a820790;hp=65d0f70e653a2ed4e82f3c2d223ca8242dd70f7c;hpb=4b98edf75f4e255f8c61087bd1525d89653a521f;p=quix0rs-gnu-social.git diff --git a/plugins/BitlyUrl/BitlyUrlPlugin.php b/plugins/BitlyUrl/BitlyUrlPlugin.php index 65d0f70e65..3b6474dd86 100644 --- a/plugins/BitlyUrl/BitlyUrlPlugin.php +++ b/plugins/BitlyUrl/BitlyUrlPlugin.php @@ -2,7 +2,7 @@ /** * StatusNet, the distributed open-source microblogging tool * - * Plugin to push RSS/Atom updates to a PubSubHubBub hub + * Plugin to use bit.ly URL shortening services. * * PHP version 5 * @@ -22,7 +22,9 @@ * @category Plugin * @package StatusNet * @author Craig Andrews - * @copyright 2009 Craig Andrews http://candrews.integralblue.com + * @author Brion Vibber + * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org + * @copyright 2010 StatusNet, Inc http://status.net/ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ @@ -31,24 +33,191 @@ if (!defined('STATUSNET')) { exit(1); } -require_once INSTALLDIR.'/plugins/UrlShortener/UrlShortenerPlugin.php'; - class BitlyUrlPlugin extends UrlShortenerPlugin { - public $serviceUrl; + public $shortenerName = 'bit.ly'; + public $serviceUrl = 'http://api.bit.ly/v3/shorten?longUrl=%s'; + public $login; // To set a site-default when admins or users don't override it. + public $apiKey; function onInitializePlugin(){ parent::onInitializePlugin(); if(!isset($this->serviceUrl)){ - throw new Exception("must specify a serviceUrl"); + // TRANS: Exception thrown when bit.ly URL shortening plugin was configured incorrectly. + throw new Exception(_m('You must specify a serviceUrl for bit.ly URL shortening.')); + } + } + + /** + * Add bit.ly to the list of available URL shorteners if it's configured, + * otherwise leave it out. + * + * @param array $shorteners + * @return boolean hook return value + */ + function onGetUrlShorteners(&$shorteners) + { + if ($this->getLogin() && $this->getApiKey()) { + return parent::onGetUrlShorteners($shorteners); } + return true; } + /** + * Short a URL + * @param url + * @return string shortened version of the url, or null if URL shortening failed + */ protected function shorten($url) { - $response = $this->http_get($url); - if(!$response) return; - return current(json_decode($response)->results)->hashUrl; + common_log(LOG_INFO, "bit.ly call for $url"); + $response = $this->query($url); + common_log(LOG_INFO, "bit.ly answer for $url is ".$response->getBody()); + return $this->decode($url, $response); + } + + /** + * Get the user's or site-wide default bit.ly login name. + * + * @return string + */ + protected function getLogin() + { + $login = common_config('bitly', 'default_login'); + if (!$login) { + $login = $this->login; + } + return $login; + } + + /** + * Get the user's or site-wide default bit.ly API key. + * + * @return string + */ + protected function getApiKey() + { + $key = common_config('bitly', 'default_apikey'); + if (!$key) { + $key = $this->apiKey; + } + return $key; + } + + /** + * Inject API key into query before sending out... + * + * @param string $url + * @return HTTPResponse + */ + protected function query($url) + { + // http://code.google.com/p/bitly-api/wiki/ApiDocumentation#/shorten + $params = http_build_query(array( + 'login' => $this->getLogin(), + 'apiKey' => $this->getApiKey()), '', '&'); + $serviceUrl = sprintf($this->serviceUrl, urlencode($url)) . '&' . $params; + + $request = HTTPClient::start(); + return $request->get($serviceUrl); + } + + /** + * JSON decode for API result + */ + protected function decode($url, $response) + { + $msg = "bit.ly returned unknown response with unknown message for $url"; + if ($response->isOk()) { + $body = $response->getBody(); + common_log(LOG_INFO, $body); + $json = json_decode($body, true); + if ($json['status_code'] == 200) { + if (isset($json['data']['url'])) { + common_log(LOG_INFO, "bit.ly returned ".$json['data']['url']." as short URL for $url"); + return $json['data']['url']; + } + $msg = "bit.ly returned ".$json['status_code']." response, but didn't find expected URL $url in $body"; + }else{ + $msg = "bit.ly returned ".$json['status_code']." response with ".$json['status_txt']." for $url"; + } + } + common_log(LOG_ERR, $msg); + return null; } -} + function onPluginVersion(array &$versions) + { + $versions[] = array('name' => sprintf('BitlyUrl (%s)', $this->shortenerName), + 'version' => GNUSOCIAL_VERSION, + 'author' => 'Craig Andrews, Brion Vibber', + 'homepage' => 'http://status.net/wiki/Plugin:BitlyUrl', + 'rawdescription' => + // TRANS: Plugin description. %1$s is the URL shortening service base URL (for example "bit.ly"). + sprintf(_m('Uses %1$s URL-shortener service.'), + $this->shortenerName)); + return true; + } + + /** + * Hook for RouterInitialized event. + * + * @param URLMapper $m path-to-action mapper + * @return boolean hook return + */ + public function onRouterInitialized(URLMapper $m) + { + $m->connect('panel/bitly', + array('action' => 'bitlyadminpanel')); + return true; + } + + /** + * If the plugin's installed, this should be accessible to admins. + */ + function onAdminPanelCheck($name, &$isOK) + { + if ($name == 'bitly') { + $isOK = true; + return false; + } + + return true; + } + + /** + * Add the bit.ly admin panel to the list... + */ + function onEndAdminPanelNav(Menu $nav) + { + if (AdminPanelAction::canAdmin('bitly')) { + $action_name = $nav->action->trimmed('action'); + + $nav->out->menuItem(common_local_url('bitlyadminpanel'), + // TRANS: Menu item in administration menus for bit.ly URL shortening settings. + _m('bit.ly'), + // TRANS: Title for menu item in administration menus for bit.ly URL shortening settings. + _m('bit.ly URL shortening.'), + $action_name == 'bitlyadminpanel', + 'nav_bitly_admin_panel'); + } + + return true; + } + + /** + * Internal hook point to check the default global credentials so + * the admin form knows if we have a fallback or not. + * + * @param string $login + * @param string $apiKey + * @return boolean hook return value + */ + function onBitlyDefaultCredentials(&$login, &$apiKey) + { + $login = $this->login; + $apiKey = $this->apiKey; + return false; + } + +}