summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/checkschema.php30
-rw-r--r--scripts/createsim.php2
-rwxr-xr-xscripts/facebookqueuehandler.php74
-rwxr-xr-xscripts/getvaliddaemons.php32
-rwxr-xr-xscripts/maildaemon.php155
-rwxr-xr-xscripts/ombqueuehandler.php2
-rwxr-xr-xscripts/pluginqueuehandler.php (renamed from scripts/twitterqueuehandler.php)38
-rw-r--r--scripts/showtable.php41
-rwxr-xr-xscripts/startdaemons.sh2
-rwxr-xr-xscripts/synctwitterfriends.php286
-rwxr-xr-xscripts/twitterstatusfetcher.php565
-rwxr-xr-xscripts/xmppdaemon.php17
12 files changed, 141 insertions, 1103 deletions
diff --git a/scripts/checkschema.php b/scripts/checkschema.php
new file mode 100644
index 000000000..bf52abe15
--- /dev/null
+++ b/scripts/checkschema.php
@@ -0,0 +1,30 @@
+#!/usr/bin/env php
+<?php
+/*
+ * StatusNet - a distributed open-source microblogging tool
+ * Copyright (C) 2008, 2009, StatusNet, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
+
+$helptext = <<<END_OF_CHECKSCHEMA_HELP
+Gives plugins a chance to update the database schema.
+
+END_OF_CHECKSCHEMA_HELP;
+
+require_once INSTALLDIR.'/scripts/commandline.inc';
+
+Event::handle('CheckSchema');
diff --git a/scripts/createsim.php b/scripts/createsim.php
index 71ed3bf72..1266a9700 100644
--- a/scripts/createsim.php
+++ b/scripts/createsim.php
@@ -101,7 +101,7 @@ function newSub($i)
$to = User::staticGet('nickname', $tunic);
- if (empty($from)) {
+ if (empty($to)) {
throw new Exception("Can't find user '$tunic'.");
}
diff --git a/scripts/facebookqueuehandler.php b/scripts/facebookqueuehandler.php
deleted file mode 100755
index e13ac4e85..000000000
--- a/scripts/facebookqueuehandler.php
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/usr/bin/env php
-<?php
-/*
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2008, 2009, StatusNet, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
-
-$shortoptions = 'i::';
-$longoptions = array('id::');
-
-$helptext = <<<END_OF_FACEBOOK_HELP
-Daemon script for pushing new notices to Facebook.
-
- -i --id Identity (default none)
-
-END_OF_FACEBOOK_HELP;
-
-require_once INSTALLDIR.'/scripts/commandline.inc';
-
-require_once INSTALLDIR . '/lib/facebookutil.php';
-require_once INSTALLDIR . '/lib/queuehandler.php';
-
-class FacebookQueueHandler extends QueueHandler
-{
- function transport()
- {
- return 'facebook';
- }
-
- function start()
- {
- $this->log(LOG_INFO, "INITIALIZE");
- return true;
- }
-
- function handle_notice($notice)
- {
- return facebookBroadcastNotice($notice);
- }
-
- function finish()
- {
- }
-
-}
-
-if (have_option('i')) {
- $id = get_option_value('i');
-} else if (have_option('--id')) {
- $id = get_option_value('--id');
-} else if (count($args) > 0) {
- $id = $args[0];
-} else {
- $id = null;
-}
-
-$handler = new FacebookQueueHandler($id);
-
-$handler->runOnce();
diff --git a/scripts/getvaliddaemons.php b/scripts/getvaliddaemons.php
index 8f48e8e6f..99ad41b37 100755
--- a/scripts/getvaliddaemons.php
+++ b/scripts/getvaliddaemons.php
@@ -35,20 +35,26 @@ ENDOFHELP;
require_once INSTALLDIR.'/scripts/commandline.inc';
+$daemons = array();
+
+$daemons[] = INSTALLDIR.'/scripts/pluginqueuehandler.php';
+$daemons[] = INSTALLDIR.'/scripts/ombqueuehandler.php';
+$daemons[] = INSTALLDIR.'/scripts/pingqueuehandler.php';
+
if(common_config('xmpp','enabled')) {
- echo "xmppdaemon.php jabberqueuehandler.php publicqueuehandler.php ";
- echo "xmppconfirmhandler.php ";
-}
-if(common_config('twitterbridge','enabled')) {
- echo "twitterstatusfetcher.php ";
-}
-echo "ombqueuehandler.php ";
-if (common_config('twitter', 'enabled')) {
- echo "twitterqueuehandler.php ";
- echo "synctwitterfriends.php ";
+ $daemons[] = INSTALLDIR.'/scripts/xmppdaemon.php';
+ $daemons[] = INSTALLDIR.'/scripts/jabberqueuehandler.php';
+ $daemons[] = INSTALLDIR.'/scripts/publicqueuehandler.php';
+ $daemons[] = INSTALLDIR.'/scripts/xmppconfirmhandler.php';
}
-echo "facebookqueuehandler.php ";
-echo "pingqueuehandler.php ";
+
if (common_config('sms', 'enabled')) {
- echo "smsqueuehandler.php ";
+ $daemons[] = INSTALLDIR.'/scripts/smsqueuehandler.php';
+}
+
+if (Event::handle('GetValidDaemons', array(&$daemons))) {
+ foreach ($daemons as $daemon) {
+ print $daemon . ' ';
+ }
+ print "\n";
}
diff --git a/scripts/maildaemon.php b/scripts/maildaemon.php
index 678ca24c3..b4e4d9f08 100755
--- a/scripts/maildaemon.php
+++ b/scripts/maildaemon.php
@@ -29,6 +29,7 @@ END_OF_HELP;
require_once INSTALLDIR.'/scripts/commandline.inc';
require_once(INSTALLDIR . '/lib/mail.php');
+require_once(INSTALLDIR . '/lib/mediafile.php');
require_once('Mail/mimeDecode.php');
# FIXME: we use both Mail_mimeDecode and mailparse
@@ -66,46 +67,32 @@ class MailerDaemon
}
$msg = $this->cleanup_msg($msg);
$msg = common_shorten_links($msg);
- if (mb_strlen($msg) > 140) {
- $this->error($from,_('That\'s too long. '.
- 'Max notice size is 140 chars.'));
+ if (Notice::contentTooLong($msg)) {
+ $this->error($from, sprintf(_('That\'s too long. '.
+ 'Max notice size is %d chars.'),
+ Notice::maxContent()));
}
- $fileRecords = array();
- foreach($attachments as $attachment){
- $mimetype = $this->getUploadedFileType($attachment);
- $stream = stream_get_meta_data($attachment);
- if (!$this->isRespectsQuota($user,filesize($stream['uri']))) {
- die('error() should trigger an exception before reaching here.');
- }
- $filename = $this->saveFile($user, $attachment,$mimetype);
-
- fclose($attachment);
-
- if (empty($filename)) {
- $this->error($from,_('Couldn\'t save file.'));
- }
- $fileRecord = $this->storeFile($filename, $mimetype);
- $fileRecords[] = $fileRecord;
- $fileurl = common_local_url('attachment',
- array('attachment' => $fileRecord->id));
+ $mediafiles = array();
- // not sure this is necessary -- Zach
- $this->maybeAddRedir($fileRecord->id, $fileurl);
+ foreach($attachments as $attachment){
- $short_fileurl = common_shorten_url($fileurl);
- $msg .= ' ' . $short_fileurl;
+ $mf = null;
- if (mb_strlen($msg) > 140) {
- $this->deleteFile($filename);
- $this->error($from,_('Max notice size is 140 chars, including attachment URL.'));
+ try {
+ $mf = MediaFile::fromFileHandle($attachment, $user);
+ } catch(ClientException $ce) {
+ $this->error($from, $ce->getMessage());
}
- // Also, not sure this is necessary -- Zach
- $this->maybeAddRedir($fileRecord->id, $short_fileurl);
+ $msg .= ' ' . $mf->shortUrl();
+
+ array_push($mediafiles, $mf);
+ fclose($attachment);
}
- $err = $this->add_notice($user, $msg, $fileRecords);
+ $err = $this->add_notice($user, $msg, $mediafiles);
+
if (is_string($err)) {
$this->error($from, $err);
return false;
@@ -114,89 +101,6 @@ class MailerDaemon
}
}
- function saveFile($user, $attachment, $mimetype) {
-
- $filename = File::filename($user->getProfile(), "email", $mimetype);
-
- $filepath = File::path($filename);
-
- $stream = stream_get_meta_data($attachment);
- if (copy($stream['uri'], $filepath) && chmod($filepath,0664)) {
- return $filename;
- } else {
- $this->error(null,_('File could not be moved to destination directory.' . $stream['uri'] . ' ' . $filepath));
- }
- }
-
- function storeFile($filename, $mimetype) {
-
- $file = new File;
- $file->filename = $filename;
-
- $file->url = File::url($filename);
-
- $filepath = File::path($filename);
-
- $file->size = filesize($filepath);
- $file->date = time();
- $file->mimetype = $mimetype;
-
- $file_id = $file->insert();
-
- if (!$file_id) {
- common_log_db_error($file, "INSERT", __FILE__);
- $this->error(null,_('There was a database error while saving your file. Please try again.'));
- }
-
- return $file;
- }
-
- function maybeAddRedir($file_id, $url)
- {
- $file_redir = File_redirection::staticGet('url', $url);
-
- if (empty($file_redir)) {
- $file_redir = new File_redirection;
- $file_redir->url = $url;
- $file_redir->file_id = $file_id;
-
- $result = $file_redir->insert();
-
- if (!$result) {
- common_log_db_error($file_redir, "INSERT", __FILE__);
- $this->error(null,_('There was a database error while saving your file. Please try again.'));
- }
- }
- }
-
- function getUploadedFileType($fileHandle) {
- require_once 'MIME/Type.php';
-
- $cmd = &PEAR::getStaticProperty('MIME_Type', 'fileCmd');
- $cmd = common_config('attachments', 'filecommand');
-
- $stream = stream_get_meta_data($fileHandle);
- $filetype = MIME_Type::autoDetect($stream['uri']);
- if (in_array($filetype, common_config('attachments', 'supported'))) {
- return $filetype;
- }
- $media = MIME_Type::getMedia($filetype);
- if ('application' !== $media) {
- $hint = sprintf(_(' Try using another %s format.'), $media);
- } else {
- $hint = '';
- }
- $this->error(null,sprintf(
- _('%s is not a supported filetype on this server.'), $filetype) . $hint);
- }
-
- function isRespectsQuota($user,$fileSize) {
- $file = new File;
- $ret = $file->isRespectsQuota($user,$fileSize);
- if (true === $ret) return true;
- $this->error(null,$ret);
- }
-
function error($from, $msg)
{
file_put_contents("php://stderr", $msg . "\n");
@@ -256,15 +160,16 @@ class MailerDaemon
common_log($level, 'MailDaemon: '.$msg);
}
- function add_notice($user, $msg, $fileRecords)
+ function add_notice($user, $msg, $mediafiles)
{
- $notice = Notice::saveNew($user->id, $msg, 'mail');
- if (is_string($notice)) {
- $this->log(LOG_ERR, $notice);
- return $notice;
+ try {
+ $notice = Notice::saveNew($user->id, $msg, 'mail');
+ } catch (Exception $e) {
+ $this->log(LOG_ERR, $e->getMessage());
+ return $e->getMessage();
}
- foreach($fileRecords as $fileRecord){
- $this->attachFile($notice, $fileRecord);
+ foreach($mediafiles as $mf){
+ $mf->attachToNotice($notice);
}
common_broadcast_notice($notice);
$this->log(LOG_INFO,
@@ -272,14 +177,6 @@ class MailerDaemon
return true;
}
- function attachFile($notice, $filerec)
- {
- File_to_post::processNew($filerec->id, $notice->id);
-
- $this->maybeAddRedir($filerec->id,
- common_local_url('file', array('notice' => $notice->id)));
- }
-
function parse_message($fname)
{
$contents = file_get_contents($fname);
diff --git a/scripts/ombqueuehandler.php b/scripts/ombqueuehandler.php
index 8e685f1c8..be33b9821 100755
--- a/scripts/ombqueuehandler.php
+++ b/scripts/ombqueuehandler.php
@@ -57,7 +57,7 @@ class OmbQueueHandler extends QueueHandler
$this->log(LOG_DEBUG, 'Ignoring remote notice ' . $notice->id);
return true;
} else {
- return omb_broadcast_remote_subscribers($notice);
+ return omb_broadcast_notice($notice);
}
}
diff --git a/scripts/twitterqueuehandler.php b/scripts/pluginqueuehandler.php
index ce4d824d0..ae807db6a 100755
--- a/scripts/twitterqueuehandler.php
+++ b/scripts/pluginqueuehandler.php
@@ -23,52 +23,36 @@ define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
$shortoptions = 'i::';
$longoptions = array('id::');
-$helptext = <<<END_OF_ENJIT_HELP
-Daemon script for pushing new notices to Twitter.
+$helptext = <<<END_OF_OMB_HELP
+Daemon script for letting plugins handle stuff at queue time
-i --id Identity (default none)
-END_OF_ENJIT_HELP;
+END_OF_OMB_HELP;
require_once INSTALLDIR.'/scripts/commandline.inc';
-
-require_once INSTALLDIR . '/lib/twitter.php';
require_once INSTALLDIR . '/lib/queuehandler.php';
-class TwitterQueueHandler extends QueueHandler
+class PluginQueueHandler extends QueueHandler
{
- function transport()
- {
- return 'twitter';
- }
- function start()
+ function transport()
{
- $this->log(LOG_INFO, "INITIALIZE");
- return true;
+ return 'plugin';
}
function handle_notice($notice)
{
- return broadcast_twitter($notice);
- }
-
- function finish()
- {
+ Event::handle('HandleQueuedNotice', array(&$notice));
+ return true;
}
-
}
-if (have_option('i')) {
- $id = get_option_value('i');
-} else if (have_option('--id')) {
- $id = get_option_value('--id');
-} else if (count($args) > 0) {
- $id = $args[0];
+if (have_option('i', 'id')) {
+ $id = get_option_value('i', 'id');
} else {
$id = null;
}
-$handler = new TwitterQueueHandler($id);
-
+$handler = new PluginQueueHandler($id);
$handler->runOnce();
diff --git a/scripts/showtable.php b/scripts/showtable.php
new file mode 100644
index 000000000..eb18a98e2
--- /dev/null
+++ b/scripts/showtable.php
@@ -0,0 +1,41 @@
+#!/usr/bin/env php
+<?php
+/*
+ * StatusNet - a distributed open-source microblogging tool
+ * Copyright (C) 2008, 2009, StatusNet, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
+
+$helptext = <<<END_OF_SHOWTABLE_HELP
+showtable.php <tablename>
+Shows the structure of a table
+
+END_OF_SHOWTABLE_HELP;
+
+require_once INSTALLDIR.'/scripts/commandline.inc';
+
+if (count($args) != 1) {
+ show_help();
+}
+
+$name = $args[0];
+
+$schema = Schema::get();
+
+$td = $schema->getTableDef($name);
+
+print_r($td);
diff --git a/scripts/startdaemons.sh b/scripts/startdaemons.sh
index 298162673..5fb75414d 100755
--- a/scripts/startdaemons.sh
+++ b/scripts/startdaemons.sh
@@ -40,7 +40,7 @@ DAEMONS=`php $DIR/getvaliddaemons.php $ARGSG`
for f in $DAEMONS; do
printf "Starting $f...";
- php $DIR/$f $ARGSD
+ php $f $ARGSD
printf "DONE.\n"
done
diff --git a/scripts/synctwitterfriends.php b/scripts/synctwitterfriends.php
deleted file mode 100755
index b30e700a1..000000000
--- a/scripts/synctwitterfriends.php
+++ /dev/null
@@ -1,286 +0,0 @@
-#!/usr/bin/env php
-<?php
-/*
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2008, 2009, StatusNet, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
-
-$shortoptions = 'di::';
-$longoptions = array('id::', 'debug');
-
-$helptext = <<<END_OF_TRIM_HELP
-Batch script for synching local friends with Twitter friends.
- -i --id Identity (default 'generic')
- -d --debug Debug (lots of log output)
-
-END_OF_TRIM_HELP;
-
-require_once INSTALLDIR . '/scripts/commandline.inc';
-require_once INSTALLDIR . '/lib/parallelizingdaemon.php';
-
-/**
- * Daemon to sync local friends with Twitter friends
- *
- * @category Twitter
- * @package StatusNet
- * @author Zach Copley <zach@status.net>
- * @author Evan Prodromou <evan@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/
- */
-
-$helptext = <<<END_OF_TWITTER_HELP
-Batch script for synching local friends with Twitter friends.
-
-END_OF_TWITTER_HELP;
-
-require_once INSTALLDIR . '/scripts/commandline.inc';
-require_once INSTALLDIR . '/lib/parallelizingdaemon.php';
-
-class SyncTwitterFriendsDaemon extends ParallelizingDaemon
-{
- /**
- * Constructor
- *
- * @param string $id the name/id of this daemon
- * @param int $interval sleep this long before doing everything again
- * @param int $max_children maximum number of child processes at a time
- * @param boolean $debug debug output flag
- *
- * @return void
- *
- **/
-
- function __construct($id = null, $interval = 60,
- $max_children = 2, $debug = null)
- {
- parent::__construct($id, $interval, $max_children, $debug);
- }
-
- /**
- * Name of this daemon
- *
- * @return string Name of the daemon.
- */
-
- function name()
- {
- return ('synctwitterfriends.' . $this->_id);
- }
-
- /**
- * Find all the Twitter foreign links for users who have requested
- * automatically subscribing to their Twitter friends locally.
- *
- * @return array flinks an array of Foreign_link objects
- */
- function getObjects()
- {
- $flinks = array();
- $flink = new Foreign_link();
-
- $conn = &$flink->getDatabaseConnection();
-
- $flink->service = TWITTER_SERVICE;
- $flink->orderBy('last_friendsync');
- $flink->limit(25); // sync this many users during this run
- $flink->find();
-
- while ($flink->fetch()) {
- if (($flink->friendsync & FOREIGN_FRIEND_RECV) == FOREIGN_FRIEND_RECV) {
- $flinks[] = clone($flink);
- }
- }
-
- $conn->disconnect();
-
- global $_DB_DATAOBJECT;
- unset($_DB_DATAOBJECT['CONNECTIONS']);
-
- return $flinks;
- }
-
- function childTask($flink) {
-
- // Each child ps needs its own DB connection
-
- // Note: DataObject::getDatabaseConnection() creates
- // a new connection if there isn't one already
-
- $conn = &$flink->getDatabaseConnection();
-
- $this->subscribeTwitterFriends($flink);
-
- $flink->last_friendsync = common_sql_now();
- $flink->update();
-
- $conn->disconnect();
-
- // XXX: Couldn't find a less brutal way to blow
- // away a cached connection
-
- global $_DB_DATAOBJECT;
- unset($_DB_DATAOBJECT['CONNECTIONS']);
- }
-
- function fetchTwitterFriends($flink)
- {
- $friends = array();
-
- $client = null;
-
- if (TwitterOAuthClient::isPackedToken($flink->credentials)) {
- $token = TwitterOAuthClient::unpackToken($flink->credentials);
- $client = new TwitterOAuthClient($token->key, $token->secret);
- common_debug($this->name() . '- Grabbing friends IDs with OAuth.');
- } else {
- $client = new TwitterBasicAuthClient($flink);
- common_debug($this->name() . '- Grabbing friends IDs with basic auth.');
- }
-
- try {
- $friends_ids = $client->friendsIds();
- } catch (Exception $e) {
- common_log(LOG_WARNING, $this->name() .
- ' - cURL error getting friend ids ' .
- $e->getCode() . ' - ' . $e->getMessage());
- return $friends;
- }
-
- if (empty($friends_ids)) {
- common_debug($this->name() .
- " - Twitter user $flink->foreign_id " .
- 'doesn\'t have any friends!');
- return $friends;
- }
-
- common_debug($this->name() . ' - Twitter\'s API says Twitter user id ' .
- "$flink->foreign_id has " .
- count($friends_ids) . ' friends.');
-
- // Calculate how many pages to get...
- $pages = ceil(count($friends_ids) / 100);
-
- if ($pages == 0) {
- common_debug($this->name() . " - $user seems to have no friends.");
- }
-
- for ($i = 1; $i <= $pages; $i++) {
-
- try {
- $more_friends = $client->statusesFriends(null, null, null, $i);
- } catch (Exception $e) {
- common_log(LOG_WARNING, $this->name() .
- ' - cURL error getting Twitter statuses/friends ' .
- "page $i - " . $e->getCode() . ' - ' .
- $e->getMessage());
- }
-
- if (empty($more_friends)) {
- common_log(LOG_WARNING, $this->name() .
- " - Couldn't retrieve page $i " .
- "of Twitter user $flink->foreign_id friends.");
- continue;
- } else {
- $friends = array_merge($friends, $more_friends);
- }
- }
-
- return $friends;
- }
-
- function subscribeTwitterFriends($flink)
- {
- $friends = $this->fetchTwitterFriends($flink);
-
- if (empty($friends)) {
- common_debug($this->name() .
- ' - Couldn\'t get friends from Twitter for ' .
- "Twitter user $flink->foreign_id.");
- return false;
- }
-
- $user = $flink->getUser();
-
- foreach ($friends as $friend) {
-
- $friend_name = $friend->screen_name;
- $friend_id = (int) $friend->id;
-
- // Update or create the Foreign_user record for each
- // Twitter friend
-
- if (!save_twitter_user($friend_id, $friend_name)) {
- common_log(LOG_WARNING, $this-name() .
- " - Couldn't save $screen_name's friend, $friend_name.");
- continue;
- }
-
- // Check to see if there's a related local user
-
- $friend_flink = Foreign_link::getByForeignID($friend_id,
- TWITTER_SERVICE);
-
- if (!empty($friend_flink)) {
-
- // Get associated user and subscribe her
-
- $friend_user = User::staticGet('id', $friend_flink->user_id);
-
- if (!empty($friend_user)) {
- $result = subs_subscribe_to($user, $friend_user);
-
- if ($result === true) {
- common_log(LOG_INFO,
- $this->name() . ' - Subscribed ' .
- "$friend_user->nickname to $user->nickname.");
- } else {
- common_debug($this->name() .
- ' - Tried subscribing ' .
- "$friend_user->nickname to $user->nickname - " .
- $result);
- }
- }
- }
- }
-
- return true;
- }
-
-}
-
-$id = null;
-$debug = null;
-
-if (have_option('i')) {
- $id = get_option_value('i');
-} else if (have_option('--id')) {
- $id = get_option_value('--id');
-} else if (count($args) > 0) {
- $id = $args[0];
-} else {
- $id = null;
-}
-
-if (have_option('d') || have_option('debug')) {
- $debug = true;
-}
-
-$syncer = new SyncTwitterFriendsDaemon($id, 60, 2, $debug);
-$syncer->runOnce();
-
diff --git a/scripts/twitterstatusfetcher.php b/scripts/twitterstatusfetcher.php
deleted file mode 100755
index 3cdf1867a..000000000
--- a/scripts/twitterstatusfetcher.php
+++ /dev/null
@@ -1,565 +0,0 @@
-#!/usr/bin/env php
-<?php
-/**
- * StatusNet - the distributed open-source microblogging tool
- * Copyright (C) 2008, 2009, StatusNet, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
-
-// Tune number of processes and how often to poll Twitter
-// XXX: Should these things be in config.php?
-define('MAXCHILDREN', 2);
-define('POLL_INTERVAL', 60); // in seconds
-
-$shortoptions = 'di::';
-$longoptions = array('id::', 'debug');
-
-$helptext = <<<END_OF_TRIM_HELP
-Batch script for retrieving Twitter messages from foreign service.
-
- -i --id Identity (default 'generic')
- -d --debug Debug (lots of log output)
-
-END_OF_TRIM_HELP;
-
-require_once INSTALLDIR .'/scripts/commandline.inc';
-require_once INSTALLDIR . '/lib/daemon.php';
-
-/**
- * Fetcher for statuses from Twitter
- *
- * Fetches statuses from Twitter and inserts them as notices in local
- * system.
- *
- * @category Twitter
- * @package StatusNet
- * @author Zach Copley <zach@status.net>
- * @author Evan Prodromou <evan@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/
- */
-
-// NOTE: an Avatar path MUST be set in config.php for this
-// script to work: e.g.: $config['avatar']['path'] = '/statusnet/avatar';
-
-class TwitterStatusFetcher extends ParallelizingDaemon
-{
- /**
- * Constructor
- *
- * @param string $id the name/id of this daemon
- * @param int $interval sleep this long before doing everything again
- * @param int $max_children maximum number of child processes at a time
- * @param boolean $debug debug output flag
- *
- * @return void
- *
- **/
- function __construct($id = null, $interval = 60,
- $max_children = 2, $debug = null)
- {
- parent::__construct($id, $interval, $max_children, $debug);
- }
-
- /**
- * Name of this daemon
- *
- * @return string Name of the daemon.
- */
-
- function name()
- {
- return ('twitterstatusfetcher.'.$this->_id);
- }
-
- /**
- * Find all the Twitter foreign links for users who have requested
- * importing of their friends' timelines
- *
- * @return array flinks an array of Foreign_link objects
- */
-
- function getObjects()
- {
- global $_DB_DATAOBJECT;
-
- $flink = new Foreign_link();
- $conn = &$flink->getDatabaseConnection();
-
- $flink->service = TWITTER_SERVICE;
- $flink->orderBy('last_noticesync');
- $flink->find();
-
- $flinks = array();
-
- while ($flink->fetch()) {
-
- if (($flink->noticesync & FOREIGN_NOTICE_RECV) ==
- FOREIGN_NOTICE_RECV) {
- $flinks[] = clone($flink);
- }
- }
-
- $flink->free();
- unset($flink);
-
- $conn->disconnect();
- unset($_DB_DATAOBJECT['CONNECTIONS']);
-
- return $flinks;
- }
-
- function childTask($flink) {
-
- // Each child ps needs its own DB connection
-
- // Note: DataObject::getDatabaseConnection() creates
- // a new connection if there isn't one already
-
- $conn = &$flink->getDatabaseConnection();
-
- $this->getTimeline($flink);
-
- $flink->last_friendsync = common_sql_now();
- $flink->update();
-
- $conn->disconnect();
-
- // XXX: Couldn't find a less brutal way to blow
- // away a cached connection
-
- global $_DB_DATAOBJECT;
- unset($_DB_DATAOBJECT['CONNECTIONS']);
- }
-
- function getTimeline($flink)
- {
- if (empty($flink)) {
- common_log(LOG_WARNING, $this->name() .
- " - Can't retrieve Foreign_link for foreign ID $fid");
- return;
- }
-
- common_debug($this->name() . ' - Trying to get timeline for Twitter user ' .
- $flink->foreign_id);
-
- // XXX: Biggest remaining issue - How do we know at which status
- // to start importing? How many statuses? Right now I'm going
- // with the default last 20.
-
- $client = null;
-
- if (TwitterOAuthClient::isPackedToken($flink->credentials)) {
- $token = TwitterOAuthClient::unpackToken($flink->credentials);
- $client = new TwitterOAuthClient($token->key, $token->secret);
- common_debug($this->name() . ' - Grabbing friends timeline with OAuth.');
- } else {
- $client = new TwitterBasicAuthClient($flink);
- common_debug($this->name() . ' - Grabbing friends timeline with basic auth.');
- }
-
- $timeline = null;
-
- try {
- $timeline = $client->statusesFriendsTimeline();
- } catch (Exception $e) {
- common_log(LOG_WARNING, $this->name() .
- ' - Twitter client unable to get friends timeline for user ' .
- $flink->user_id . ' - code: ' .
- $e->getCode() . 'msg: ' . $e->getMessage());
- }
-
- if (empty($timeline)) {
- common_log(LOG_WARNING, $this->name() . " - Empty timeline.");
- return;
- }
-
- // Reverse to preserve order
-
- foreach (array_reverse($timeline) as $status) {
-
- // Hacktastic: filter out stuff coming from this StatusNet
-
- $source = mb_strtolower(common_config('integration', 'source'));
-
- if (preg_match("/$source/", mb_strtolower($status->source))) {
- common_debug($this->name() . ' - Skipping import of status ' .
- $status->id . ' with source ' . $source);
- continue;
- }
-
- $this->saveStatus($status, $flink);
- }
-
- // Okay, record the time we synced with Twitter for posterity
-
- $flink->last_noticesync = common_sql_now();
- $flink->update();
- }
-
- function saveStatus($status, $flink)
- {
- $id = $this->ensureProfile($status->user);
-
- $profile = Profile::staticGet($id);
-
- if (empty($profile)) {
- common_log(LOG_ERR, $this->name() .
- ' - Problem saving notice. No associated Profile.');
- return null;
- }
-
- // XXX: change of screen name?
-
- $uri = 'http://twitter.com/' . $status->user->screen_name .
- '/status/' . $status->id;
-
- $notice = Notice::staticGet('uri', $uri);
-
- // check to see if we've already imported the status
-
- if (empty($notice)) {
-
- $notice = new Notice();
-
- $notice->profile_id = $id;
- $notice->uri = $uri;
- $notice->created = strftime('%Y-%m-%d %H:%M:%S',
- strtotime($status->created_at));
- $notice->content = common_shorten_links($status->text); // XXX
- $notice->rendered = common_render_content($notice->content, $notice);
- $notice->source = 'twitter';
- $notice->reply_to = null; // XXX: lookup reply
- $notice->is_local = Notice::GATEWAY;
-
- if (Event::handle('StartNoticeSave', array(&$notice))) {
- $id = $notice->insert();
- Event::handle('EndNoticeSave', array($notice));
- }
- }
-
- if (!Notice_inbox::pkeyGet(array('notice_id' => $notice->id,
- 'user_id' => $flink->user_id))) {
- // Add to inbox
- $inbox = new Notice_inbox();
-
- $inbox->user_id = $flink->user_id;
- $inbox->notice_id = $notice->id;
- $inbox->created = $notice->created;
- $inbox->source = NOTICE_INBOX_SOURCE_GATEWAY; // From a private source
-
- $inbox->insert();
- }
- }
-
- function ensureProfile($user)
- {
- // check to see if there's already a profile for this user
-
- $profileurl = 'http://twitter.com/' . $user->screen_name;
- $profile = Profile::staticGet('profileurl', $profileurl);
-
- if (!empty($profile)) {
- common_debug($this->name() .
- " - Profile for $profile->nickname found.");
-
- // Check to see if the user's Avatar has changed
-
- $this->checkAvatar($user, $profile);
- return $profile->id;
-
- } else {
- common_debug($this->name() . ' - Adding profile and remote profile ' .
- "for Twitter user: $profileurl.");
-
- $profile = new Profile();
- $profile->query("BEGIN");
-
- $profile->nickname = $user->screen_name;
- $profile->fullname = $user->name;
- $profile->homepage = $user->url;
- $profile->bio = $user->description;
- $profile->location = $user->location;
- $profile->profileurl = $profileurl;
- $profile->created = common_sql_now();
-
- $id = $profile->insert();
-
- if (empty($id)) {
- common_log_db_error($profile, 'INSERT', __FILE__);
- $profile->query("ROLLBACK");
- return false;
- }
-
- // check for remote profile
-
- $remote_pro = Remote_profile::staticGet('uri', $profileurl);
-
- if (empty($remote_pro)) {
-
- $remote_pro = new Remote_profile();
-
- $remote_pro->id = $id;
- $remote_pro->uri = $profileurl;
- $remote_pro->created = common_sql_now();
-
- $rid = $remote_pro->insert();
-
- if (empty($rid)) {
- common_log_db_error($profile, 'INSERT', __FILE__);
- $profile->query("ROLLBACK");
- return false;
- }
- }
-
- $profile->query("COMMIT");
-
- $this->saveAvatars($user, $id);
-
- return $id;
- }
- }
-
- function checkAvatar($twitter_user, $profile)
- {
- global $config;
-
- $path_parts = pathinfo($twitter_user->profile_image_url);
-
- $newname = 'Twitter_' . $twitter_user->id . '_' .
- $path_parts['basename'];
-
- $oldname = $profile->getAvatar(48)->filename;
-
- if ($newname != $oldname) {
- common_debug($this->name() . ' - Avatar for Twitter user ' .
- "$profile->nickname has changed.");
- common_debug($this->name() . " - old: $oldname new: $newname");
-
- $this->updateAvatars($twitter_user, $profile);
- }
-
- if ($this->missingAvatarFile($profile)) {
- common_debug($this->name() . ' - Twitter user ' .
- $profile->nickname .
- ' is missing one or more local avatars.');
- common_debug($this->name() ." - old: $oldname new: $newname");
-
- $this->updateAvatars($twitter_user, $profile);
- }
-
- }
-
- function updateAvatars($twitter_user, $profile) {
-
- global $config;
-
- $path_parts = pathinfo($twitter_user->profile_image_url);
-
- $img_root = substr($path_parts['basename'], 0, -11);
- $ext = $path_parts['extension'];
- $mediatype = $this->getMediatype($ext);
-
- foreach (array('mini', 'normal', 'bigger') as $size) {
- $url = $path_parts['dirname'] . '/' .
- $img_root . '_' . $size . ".$ext";
- $filename = 'Twitter_' . $twitter_user->id . '_' .
- $img_root . "_$size.$ext";
-
- $this->updateAvatar($profile->id, $size, $mediatype, $filename);
- $this->fetchAvatar($url, $filename);
- }
- }
-
- function missingAvatarFile($profile) {
-
- foreach (array(24, 48, 73) as $size) {
-
- $filename = $profile->getAvatar($size)->filename;
- $avatarpath = Avatar::path($filename);
-
- if (file_exists($avatarpath) == FALSE) {
- return true;
- }
- }
-
- return false;
- }
-
- function getMediatype($ext)
- {
- $mediatype = null;
-
- switch (strtolower($ext)) {
- case 'jpg':
- $mediatype = 'image/jpg';
- break;
- case 'gif':
- $mediatype = 'image/gif';
- break;
- default:
- $mediatype = 'image/png';
- }
-
- return $mediatype;
- }
-
- function saveAvatars($user, $id)
- {
- global $config;
-
- $path_parts = pathinfo($user->profile_image_url);
- $ext = $path_parts['extension'];
- $end = strlen('_normal' . $ext);
- $img_root = substr($path_parts['basename'], 0, -($end+1));
- $mediatype = $this->getMediatype($ext);
-
- foreach (array('mini', 'normal', 'bigger') as $size) {
- $url = $path_parts['dirname'] . '/' .
- $img_root . '_' . $size . ".$ext";
- $filename = 'Twitter_' . $user->id . '_' .
- $img_root . "_$size.$ext";
-
- if ($this->fetchAvatar($url, $filename)) {
- $this->newAvatar($id, $size, $mediatype, $filename);
- } else {
- common_log(LOG_WARNING, $this->id() .
- " - Problem fetching Avatar: $url");
- }
- }
- }
-
- function updateAvatar($profile_id, $size, $mediatype, $filename) {
-
- common_debug($this->name() . " - Updating avatar: $size");
-
- $profile = Profile::staticGet($profile_id);
-
- if (empty($profile)) {
- common_debug($this->name() . " - Couldn't get profile: $profile_id!");
- return;
- }
-
- $sizes = array('mini' => 24, 'normal' => 48, 'bigger' => 73);
- $avatar = $profile->getAvatar($sizes[$size]);
-
- // Delete the avatar, if present
-
- if ($avatar) {
- $avatar->delete();
- }
-
- $this->newAvatar($profile->id, $size, $mediatype, $filename);
- }
-
- function newAvatar($profile_id, $size, $mediatype, $filename)
- {
- global $config;
-
- $avatar = new Avatar();
- $avatar->profile_id = $profile_id;
-
- switch($size) {
- case 'mini':
- $avatar->width = 24;
- $avatar->height = 24;
- break;
- case 'normal':
- $avatar->width = 48;
- $avatar->height = 48;
- break;
- default:
-
- // Note: Twitter's big avatars are a different size than
- // StatusNet's (StatusNet's = 96)
-
- $avatar->width = 73;
- $avatar->height = 73;
- }
-
- $avatar->original = 0; // we don't have the original
- $avatar->mediatype = $mediatype;
- $avatar->filename = $filename;
- $avatar->url = Avatar::url($filename);
-
- common_debug($this->name() . " - New filename: $avatar->url");
-
- $avatar->created = common_sql_now();
-
- $id = $avatar->insert();
-
- if (empty($id)) {
- common_log_db_error($avatar, 'INSERT', __FILE__);
- return null;
- }
-
- common_debug($this->name() .
- " - Saved new $size avatar for $profile_id.");
-
- return $id;
- }
-
- function fetchAvatar($url, $filename)
- {
- $avatar_dir = INSTALLDIR . '/avatar/';
-
- $avatarfile = $avatar_dir . $filename;
-
- $out = fopen($avatarfile, 'wb');
- if (!$out) {
- common_log(LOG_WARNING, $this->name() .
- " - Couldn't open file $filename");
- return false;
- }
-
- common_debug($this->name() . " - Fetching Twitter avatar: $url");
-
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_FILE, $out);
- curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 0);
- $result = curl_exec($ch);
- curl_close($ch);
-
- fclose($out);
-
- return $result;
- }
-}
-
-$id = null;
-$debug = null;
-
-if (have_option('i')) {
- $id = get_option_value('i');
-} else if (have_option('--id')) {
- $id = get_option_value('--id');
-} else if (count($args) > 0) {
- $id = $args[0];
-} else {
- $id = null;
-}
-
-if (have_option('d') || have_option('debug')) {
- $debug = true;
-}
-
-$fetcher = new TwitterStatusFetcher($id, 60, 2, $debug);
-$fetcher->runOnce();
-
diff --git a/scripts/xmppdaemon.php b/scripts/xmppdaemon.php
index 9e621e725..b2efc07c3 100755
--- a/scripts/xmppdaemon.php
+++ b/scripts/xmppdaemon.php
@@ -316,17 +316,22 @@ class XMPPDaemon extends Daemon
{
$body = trim($pl['body']);
$content_shortened = common_shorten_links($body);
- if (mb_strlen($content_shortened) > 140) {
+ if (Notice::contentTooLong($content_shortened)) {
$from = jabber_normalize_jid($pl['from']);
- $this->from_site($from, "Message too long - maximum is 140 characters, you sent ".mb_strlen($content_shortened));
+ $this->from_site($from, sprintf(_("Message too long - maximum is %d characters, you sent %d"),
+ Notice::maxContent(),
+ mb_strlen($content_shortened)));
return;
}
- $notice = Notice::saveNew($user->id, $content_shortened, 'xmpp');
- if (is_string($notice)) {
- $this->log(LOG_ERR, $notice);
- $this->from_site($user->jabber, $notice);
+
+ try {
+ $notice = Notice::saveNew($user->id, $content_shortened, 'xmpp');
+ } catch (Exception $e) {
+ $this->log(LOG_ERR, $e->getMessage());
+ $this->from_site($user->jabber, $e->getMessage());
return;
}
+
common_broadcast_notice($notice);
$this->log(LOG_INFO,
'Added notice ' . $notice->id . ' from user ' . $user->nickname);