2010-06-16 09:55:39 +09:00
|
|
|
<?php
|
|
|
|
/**
|
2010-07-18 22:28:15 +09:00
|
|
|
* Phergie
|
2010-06-16 09:55:39 +09:00
|
|
|
*
|
|
|
|
* 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
|
|
|
|
*
|
2010-07-18 22:28:15 +09:00
|
|
|
* @category Phergie
|
2010-06-16 09:55:39 +09:00
|
|
|
* @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
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
2010-07-18 22:28:15 +09:00
|
|
|
* These requires are for library code, so they don't fit Autoload's normal
|
2010-06-16 09:55:39 +09:00
|
|
|
* 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;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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()
|
|
|
|
{
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
$nick = $this->getEvent()->getNick();
|
|
|
|
if (!$this->twitteruser) {
|
|
|
|
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
|
2010-07-18 22:28:15 +09:00
|
|
|
* @param bool $includeUrl whether or not to include the URL in the
|
2010-06-16 09:55:39 +09:00
|
|
|
* 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;
|
|
|
|
}
|
|
|
|
}
|