Merge branch '0.9.x' into 1.0.x
This commit is contained in:
@@ -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 <candrews@integralblue.com>
|
||||
* @author Brion Vibber <brion@status.net>
|
||||
* @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/
|
||||
*/
|
||||
@@ -33,26 +35,135 @@ if (!defined('STATUSNET')) {
|
||||
|
||||
class BitlyUrlPlugin extends UrlShortenerPlugin
|
||||
{
|
||||
public $serviceUrl;
|
||||
public $shortenerName = 'bit.ly';
|
||||
public $serviceUrl = 'http://bit.ly/api?method=shorten&version=2.0.1&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(_m("You must specify a serviceUrl."));
|
||||
throw new Exception(_m("You must specify a serviceUrl for bit.ly 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;
|
||||
$response = $this->query($url);
|
||||
if ($this->isOk($url, $response)) {
|
||||
return $this->decode($url, $response->getBody());
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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, $url) . '&' . $params;
|
||||
|
||||
$request = HTTPClient::start();
|
||||
return $request->get($serviceUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
* JSON decode for API result
|
||||
*/
|
||||
protected function decode($url, $body)
|
||||
{
|
||||
$json = json_decode($body, true);
|
||||
return $json['results'][$url]['shortUrl'];
|
||||
}
|
||||
|
||||
/**
|
||||
* JSON decode for API result
|
||||
*/
|
||||
protected function isOk($url, $response)
|
||||
{
|
||||
$code = 'unknown';
|
||||
$msg = '';
|
||||
if ($response->isOk()) {
|
||||
$body = $response->getBody();
|
||||
common_log(LOG_INFO, $body);
|
||||
$json = json_decode($body, true);
|
||||
if ($json['statusCode'] == 'OK') {
|
||||
$data = $json['results'][$url];
|
||||
if (isset($data['shortUrl'])) {
|
||||
return true;
|
||||
} else if (isset($data['statusCode']) && $data['statusCode'] == 'ERROR') {
|
||||
$code = $data['errorCode'];
|
||||
$msg = $data['errorMessage'];
|
||||
}
|
||||
} else if ($json['statusCode'] == 'ERROR') {
|
||||
$code = $json['errorCode'];
|
||||
$msg = $json['errorMessage'];
|
||||
}
|
||||
common_log(LOG_ERR, "bit.ly returned error $code $msg for $url");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function onPluginVersion(&$versions)
|
||||
{
|
||||
$versions[] = array('name' => sprintf('BitlyUrl (%s)', $this->shortenerName),
|
||||
'version' => STATUSNET_VERSION,
|
||||
'author' => 'Craig Andrews',
|
||||
'author' => 'Craig Andrews, Brion Vibber',
|
||||
'homepage' => 'http://status.net/wiki/Plugin:BitlyUrl',
|
||||
'rawdescription' =>
|
||||
sprintf(_m('Uses <a href="http://%1$s/">%1$s</a> URL-shortener service.'),
|
||||
@@ -60,4 +171,85 @@ class BitlyUrlPlugin extends UrlShortenerPlugin
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Hook for RouterInitialized event.
|
||||
*
|
||||
* @param Net_URL_Mapper $m path-to-action mapper
|
||||
* @return boolean hook return
|
||||
*/
|
||||
function onRouterInitialized($m)
|
||||
{
|
||||
$m->connect('admin/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($nav)
|
||||
{
|
||||
if (AdminPanelAction::canAdmin('bitly')) {
|
||||
$action_name = $nav->action->trimmed('action');
|
||||
|
||||
$nav->out->menuItem(common_local_url('bitlyadminpanel'),
|
||||
_m('bit.ly'),
|
||||
_m('bit.ly URL shortening'),
|
||||
$action_name == 'bitlyadminpanel',
|
||||
'nav_bitly_admin_panel');
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Automatically load the actions and libraries used by the plugin
|
||||
*
|
||||
* @param Class $cls the class
|
||||
*
|
||||
* @return boolean hook return
|
||||
*
|
||||
*/
|
||||
function onAutoload($cls)
|
||||
{
|
||||
$base = dirname(__FILE__);
|
||||
$lower = strtolower($cls);
|
||||
switch ($lower) {
|
||||
case 'bitlyadminpanelaction':
|
||||
require_once "$base/$lower.php";
|
||||
return false;
|
||||
default:
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
Reference in New Issue
Block a user