gnu-social/plugins/Irc/extlib/phergie/Phergie/Plugin/Twitter.php

224 lines
6.2 KiB
PHP
Raw Normal View History

2010-06-16 01:55:39 +01:00
<?php
/**
* Phergie
*
* PHP version 5
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.
* It is also available through the world-wide-web at this URL:
* http://phergie.org/license
*
* @category Phergie
* @package Phergie_Plugin_Twitter
* @author Phergie Development Team <team@phergie.org>
* @copyright 2008-2010 Phergie Development Team (http://phergie.org)
* @license http://phergie.org/license New BSD License
* @link http://pear.phergie.org/package/Phergie_Plugin_Twitter
*/
/**
* These requires are for library code, so they don't fit Autoload's normal
* conventions.
*
* @link http://github.com/scoates/simpletweet
*/
require dirname(__FILE__) . '/Twitter/twitter.class.php';
require dirname(__FILE__) . '/Twitter/laconica.class.php';
/**
* Twitter plugin; Allows tweet (if configured) and twitter commands
*
* Usage:
* tweet text to tweet
* (sends a message to twitter and Phergie will give you the link)
* twitter username
* (fetches and displays the last tweet by @username)
* twitter username 3
* (fetches and displays the third last tweet by @username)
* twitter 1234567
* (fetches and displays tweet number 1234567)
* http://twitter.com/username/statuses/1234567
* (same as `twitter 1234567`)
*
* @category Phergie
* @package Phergie_Plugin_Twitter
* @author Phergie Development Team <team@phergie.org>
* @license http://phergie.org/license New BSD License
* @link http://pear.phergie.org/package/Phergie_Plugin_Twitter
* @uses Phergie_Plugin_Time pear.phergie.org
*/
class Phergie_Plugin_Twitter extends Phergie_Plugin_Abstract
{
/**
* Twitter object (from Simpletweet)
*/
protected $twitter;
/**
* Twitter user
*/
protected $twitteruser = null;
/**
* Password
*/
protected $twitterpassword = null;
/**
* Allow only admins to tweet
*/
protected $requireAdmin = true;
/**
* Register with the URL plugin, if possible
*
* @return void
*/
public function onConnect()
{
if ($url = $this->getPluginHandler()->getPlugin('Url')) {
$url->registerRenderer($this);
}
}
/**
* Initialize (set up configuration vars)
*
* @return void
*/
public function onLoad()
{
// see if tweetrequireadmin defined in config
if (isset($this->config['twitter.tweetrequireadmin'])
&& $req = $this->config['twitter.tweetrequireadmin']
) {
// if so, override default
$this->requireAdmin = $req;
}
if (!isset($this->config['twitter.class'])
|| !$twitterClass = $this->config['twitter.class']
) {
$twitterClass = 'Twitter';
}
$this->twitteruser = $this->config['twitter.user'];
$this->twitterpassword = $this->config['twitter.password'];
$url = $this->config['twitter.url'];
$this->twitter = new $twitterClass(
$this->twitteruser,
$this->twitterpassword,
$url
);
}
/**
* Fetches the associated tweet and relays it to the channel
*
* @param string $tweeter if numeric the tweet number/id, otherwise the
* twitter user name (optionally prefixed with @)
* @param int $num optional tweet number for this user (number of
* tweets ago)
*
* @return void
*/
public function onCommandTwitter($tweeter = null, $num = 1)
{
$source = $this->getEvent()->getSource();
if (is_numeric($tweeter)) {
$tweet = $this->twitter->getTweetByNum($tweeter);
} else if (is_null($tweeter) && $this->twitteruser) {
$tweet = $this->twitter->getLastTweet($this->twitteruser, 1);
} else {
$tweet = $this->twitter->getLastTweet(ltrim($tweeter, '@'), $num);
}
if ($tweet) {
$this->doPrivmsg($source, $this->formatTweet($tweet));
}
}
/**
* Sends a tweet to Twitter as the configured user
*
* @param string $txt the text to tweet
*
* @return void
*/
public function onCommandTweet($txt)
{
echo "Tweet!\n";
$nick = $this->getEvent()->getNick();
if (!$this->twitteruser) {
return;
}
if ($this->requireAdmin && !$this->fromAdmin(true)) {
return;
}
$source = $this->getEvent()->getSource();
if ($tweet = $this->twitter->sendTweet($txt)) {
$this->doPrivmsg(
$source, 'Tweeted: '
. $this->twitter->getUrlOutputStatus($tweet)
);
} else {
$this->doNotice($nick, 'Tweet failed');
}
}
/**
* Formats a Tweet into a message suitable for output
*
* @param object $tweet JSON-decoded tweet object from Twitter
* @param bool $includeUrl whether or not to include the URL in the
* formatted output
*
* @return string
*/
protected function formatTweet(StdClass $tweet, $includeUrl = true)
{
$ts = $this->plugins->time->getCountDown($tweet->created_at);
$out = '<@' . $tweet->user->screen_name .'> '. $tweet->text
. ' - ' . $ts . ' ago';
if ($includeUrl) {
$out .= ' (' . $this->twitter->getUrlOutputStatus($tweet) . ')';
}
return $out;
}
/**
* Renders a URL
*
* @param array $parsed parse_url() output for the URL to render
*
* @return bool
*/
public function renderUrl(array $parsed)
{
if ($parsed['host'] != 'twitter.com'
&& $parsed['host'] != 'www.twitter.com'
) {
// unable to render non-twitter URLs
return false;
}
$source = $this->getEvent()->getSource();
if (preg_match('#^/(.*?)/status(es)?/([0-9]+)$#', $parsed['path'], $matches)
) {
$tweet = $this->twitter->getTweetByNum($matches[3]);
if ($tweet) {
$this->doPrivmsg($source, $this->formatTweet($tweet, false));
}
return true;
}
// if we get this far, we haven't satisfied the URL, so bail:
return false;
}
}