summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorZach Copley <zach@status.net>2009-11-19 20:12:46 -0800
committerZach Copley <zach@status.net>2009-11-19 20:12:46 -0800
commit4b98edf75f4e255f8c61087bd1525d89653a521f (patch)
treeb2a7eb6d77429eadb1beabe2d5e6ae1c1a2831d6 /scripts
parentf92574dbcb1f2d7cd0aaf3c9362db46fa066e888 (diff)
parentc213477081afefb1720c8ae729d1965e7a1dac63 (diff)
Merge branch '0.9-release'
* 0.9-release: (874 commits) Removed call to NewDirectMessage() until IE return is fixed i.e., Don't show flag user button your own profile Fixed HXR response for flag user Using the right form class name Using common_redirect Left a form_data class of a <ul> in the user admin panel Added validation to fields in user admin panel Added a user admin panel Added mobile logos for default and identica themes Changed gif to png Changed this to action. THANKS zach! Doing content negotiation only once Add execute bit to pingqueuehandler Localisation updates for !StatusNet from !translatewiki.net Use the browser's geolocation API to set the location on the notice form Add geometa library, and include it. Add location form elements to the noticeform, and save their values on submission Use the $user object nickname, as login name doesnt have to == nickname anymore with plugins such as ldap/etc Revert "Re added NICKNAME_FMT constant to router.php." Moved most path and server settings to a new paths admin panel ... Conflicts: js/util.js locale/it_IT/LC_MESSAGES/statusnet.mo locale/mk_MK/LC_MESSAGES/statusnet.mo locale/mk_MK/LC_MESSAGES/statusnet.po locale/pt_BR/LC_MESSAGES/statusnet.mo locale/vi_VN/LC_MESSAGES/statusnet.mo plugins/InfiniteScroll/infinitescroll.js plugins/Realtime/realtimeupdate.js
Diffstat (limited to 'scripts')
-rw-r--r--scripts/checkschema.php30
-rwxr-xr-xscripts/console.php28
-rw-r--r--scripts/createsim.php2
-rwxr-xr-x[-rw-r--r--]scripts/deleteuser.php0
-rwxr-xr-xscripts/enjitqueuehandler.php58
-rwxr-xr-xscripts/facebookqueuehandler.php74
-rwxr-xr-xscripts/getvaliddaemons.php32
-rwxr-xr-xscripts/maildaemon.php155
-rwxr-xr-xscripts/ombqueuehandler.php2
-rwxr-xr-x[-rw-r--r--]scripts/pingqueuehandler.php0
-rwxr-xr-xscripts/pluginqueuehandler.php (renamed from scripts/twitterqueuehandler.php)38
-rw-r--r--scripts/showtable.php41
-rwxr-xr-xscripts/sphinx-cron.sh24
-rwxr-xr-xscripts/sphinx-indexer.sh24
-rwxr-xr-xscripts/sphinx.sh15
-rwxr-xr-xscripts/startdaemons.sh2
-rwxr-xr-xscripts/synctwitterfriends.php286
-rwxr-xr-xscripts/twitterstatusfetcher.php565
-rwxr-xr-xscripts/update_pot.sh12
-rwxr-xr-xscripts/update_translations.php44
-rw-r--r--scripts/userrole.php85
-rwxr-xr-xscripts/xmppconfirmhandler.php2
-rwxr-xr-xscripts/xmppdaemon.php19
23 files changed, 310 insertions, 1228 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/console.php b/scripts/console.php
index 41dd43f28..210d2b6b2 100755
--- a/scripts/console.php
+++ b/scripts/console.php
@@ -29,19 +29,15 @@ ENDOFHELP;
require_once INSTALLDIR.'/scripts/commandline.inc';
-if (function_exists('posix_isatty')) {
- define('CONSOLE_INTERACTIVE', posix_isatty(0));
-} else {
- // Windows? Assume we're on a terminal. :P
- define('CONSOLE_INTERACTIVE', false);
-}
-if (CONSOLE_INTERACTIVE) {
- define('CONSOLE_READLINE', function_exists('readline'));
-}
+// Assume we're on a terminal if on Windows, otherwise posix_isatty tells us.
+define('CONSOLE_INTERACTIVE', !function_exists('posix_isatty') || posix_isatty(0));
+define('CONSOLE_READLINE', CONSOLE_INTERACTIVE && function_exists('readline'));
-if (CONSOLE_READLINE && CONSOLE_INTERACTIVE && file_exists(CONSOLE_HISTORY)) {
- define(CONSOLE_HISTORY, getenv("HOME") . "/.statusnet_console_history");
- readline_read_history(CONSOLE_HISTORY);
+if (CONSOLE_READLINE && CONSOLE_INTERACTIVE) {
+ define('CONSOLE_HISTORY', getenv("HOME") . "/.statusnet_console_history");
+ if (file_exists(CONSOLE_HISTORY)) {
+ readline_read_history(CONSOLE_HISTORY);
+ }
}
function read_input_line($prompt)
@@ -50,6 +46,10 @@ function read_input_line($prompt)
if (CONSOLE_READLINE) {
$line = readline($prompt);
readline_add_history($line);
+ if (defined('CONSOLE_HISTORY')) {
+ // Save often; it's easy to hit fatal errors.
+ readline_write_history(CONSOLE_HISTORY);
+ }
return $line;
} else {
return readline_emulation($prompt);
@@ -156,7 +156,3 @@ while (!feof(STDIN)) {
}
print "\n";
}
-
-if (CONSOLE_READLINE && CONSOLE_INTERACTIVE) {
- @readline_write_history(CONSOLE_HISTORY);
-}
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/deleteuser.php b/scripts/deleteuser.php
index 52389123c..52389123c 100644..100755
--- a/scripts/deleteuser.php
+++ b/scripts/deleteuser.php
diff --git a/scripts/enjitqueuehandler.php b/scripts/enjitqueuehandler.php
index 08f733b07..afcac539a 100755
--- a/scripts/enjitqueuehandler.php
+++ b/scripts/enjitqueuehandler.php
@@ -46,8 +46,8 @@ class EnjitQueueHandler extends QueueHandler
function start()
{
- $this->log(LOG_INFO, "Starting EnjitQueueHandler");
- $this->log(LOG_INFO, "Broadcasting to ".common_config('enjit', 'apiurl'));
+ $this->log(LOG_INFO, "Starting EnjitQueueHandler");
+ $this->log(LOG_INFO, "Broadcasting to ".common_config('enjit', 'apiurl'));
return true;
}
@@ -56,16 +56,16 @@ class EnjitQueueHandler extends QueueHandler
$profile = Profile::staticGet($notice->profile_id);
- $this->log(LOG_INFO, "Posting Notice ".$notice->id." from ".$profile->nickname);
+ $this->log(LOG_INFO, "Posting Notice ".$notice->id." from ".$profile->nickname);
- if ( ! $notice->is_local ) {
- $this->log(LOG_INFO, "Skipping remote notice");
- return "skipped";
- }
+ if ( ! $notice->is_local ) {
+ $this->log(LOG_INFO, "Skipping remote notice");
+ return "skipped";
+ }
- #
- # Build an Atom message from the notice
- #
+ #
+ # Build an Atom message from the notice
+ #
$noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
$msg = $profile->nickname . ': ' . $notice->content;
@@ -86,36 +86,18 @@ class EnjitQueueHandler extends QueueHandler
$atom .= "<updated>".common_date_w3dtf($notice->modified)."</updated>\n";
$atom .= "</entry>\n";
- $url = common_config('enjit', 'apiurl') . "/submit/". common_config('enjit','apikey');
- $data = "msg=$atom";
+ $url = common_config('enjit', 'apiurl') . "/submit/". common_config('enjit','apikey');
+ $data = array(
+ 'msg' => $atom,
+ );
- #
- # POST the message to $config['enjit']['apiurl']
- #
- $ch = curl_init();
+ #
+ # POST the message to $config['enjit']['apiurl']
+ #
+ $request = HTTPClient::start();
+ $response = $request->post($url, null, $data);
- curl_setopt($ch, CURLOPT_URL, $url);
-
- curl_setopt($ch, CURLOPT_HEADER, 1);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
- curl_setopt($ch, CURLOPT_POST, 1) ;
- curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
-
- # SSL and Debugging options
- #
- # curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
- # curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
- # curl_setopt($ch, CURLOPT_VERBOSE, 1);
-
- $result = curl_exec($ch);
-
- $code = curl_getinfo($ch, CURLINFO_HTTP_CODE );
-
- $this->log(LOG_INFO, "Response Code: $code");
-
- curl_close($ch);
-
- return $code;
+ return $response->isOk();
}
}
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/pingqueuehandler.php b/scripts/pingqueuehandler.php
index c92337e36..c92337e36 100644..100755
--- a/scripts/pingqueuehandler.php
+++ b/scripts/pingqueuehandler.php
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/sphinx-cron.sh b/scripts/sphinx-cron.sh
deleted file mode 100755
index bc537af1a..000000000
--- a/scripts/sphinx-cron.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/sh
-
-# 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/>.
-
-# This program tries to start the daemons for StatusNet.
-# Note that the 'maildaemon' needs to run as a mail filter.
-
-/usr/local/bin/indexer --config /usr/local/etc/sphinx.conf --all --rotate
-
diff --git a/scripts/sphinx-indexer.sh b/scripts/sphinx-indexer.sh
deleted file mode 100755
index 1ec0826be..000000000
--- a/scripts/sphinx-indexer.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/sh
-
-# 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/>.
-
-# This program tries to start the daemons for StatusNet.
-# Note that the 'maildaemon' needs to run as a mail filter.
-
-/usr/local/bin/indexer --config /usr/local/etc/sphinx.conf --all
-
diff --git a/scripts/sphinx.sh b/scripts/sphinx.sh
deleted file mode 100755
index b8edeb302..000000000
--- a/scripts/sphinx.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-if [[ $1 = "start" ]]
-then
- echo "Stopping any running daemons..."
- /usr/local/bin/searchd --config /usr/local/etc/sphinx.conf --stop 2> /dev/null
- echo "Starting sphinx search daemon..."
- /usr/local/bin/searchd --config /usr/local/etc/sphinx.conf 2> /dev/null
-fi
-
-if [[ $1 = "stop" ]]
-then
- echo "Stopping sphinx search daemon..."
- /usr/local/bin/searchd --config /usr/local/etc/sphinx.conf --stop 2> /dev/null
-fi
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/update_pot.sh b/scripts/update_pot.sh
index 9419e4337..de53fe7c9 100755
--- a/scripts/update_pot.sh
+++ b/scripts/update_pot.sh
@@ -1,3 +1,13 @@
cd `dirname $0`
cd ..
-xgettext --from-code=UTF-8 --default-domain=statusnet --output=locale/statusnet.po --language=PHP --join-existing actions/*.php classes/*.php lib/*.php scripts/*.php
+xgettext \
+ --from-code=UTF-8 \
+ --default-domain=statusnet \
+ --output=locale/statusnet.po \
+ --language=PHP \
+ --keyword="pgettext:1c,2" \
+ --keyword="npgettext:1c,2,3" \
+ actions/*.php \
+ classes/*.php \
+ lib/*.php \
+ scripts/*.php
diff --git a/scripts/update_translations.php b/scripts/update_translations.php
index f145c1f0b..580c472ee 100755
--- a/scripts/update_translations.php
+++ b/scripts/update_translations.php
@@ -39,12 +39,47 @@ set_time_limit(60);
$languages = get_all_languages();
/* Update the languages */
+// Language code conversion for translatewiki.net (these are MediaWiki codes)
+$codeMap = array(
+ 'nb' => 'no',
+ 'pt_BR' => 'pt-br',
+ 'zh_CN' => 'zh-hans',
+ 'zh_TW' => 'zh-hant'
+);
+
+$doneCodes = array();
foreach ($languages as $language) {
+ $code = $language['lang'];
+
+ // Skip export of source language
+ // and duplicates
+ if( $code == 'en' || $code == 'no' ) {
+ continue;
+ }
+
+ // Do not export codes twice (happens for 'nb')
+ if( in_array( $code, $doneCodes ) ) {
+ continue;
+ } else {
+ $doneCodes[] = $code;
+ }
+
+ // Convert code if needed
+ if( isset( $codeMap[$code] ) ) {
+ $twnCode = $codeMap[$code];
+ } else {
+ $twnCode = str_replace('_', '-', strtolower($code)); // pt_BR -> pt-br
+ }
+
+ // Fetch updates from translatewiki.net...
+ $file_url = 'http://translatewiki.net/w/i.php?' .
+ http_build_query(array(
+ 'title' => 'Special:Translate',
+ 'task' => 'export-to-file',
+ 'group' => 'out-statusnet',
+ 'language' => $twnCode));
- $code = $language['lang'];
- $file_url = 'http://status.net/pootle/' . $code .
- '/statusnet/LC_MESSAGES/statusnet.po';
$lcdir = INSTALLDIR . '/locale/' . $code;
$msgdir = "$lcdir/LC_MESSAGES";
$pofile = "$msgdir/statusnet.po";
@@ -72,7 +107,8 @@ foreach ($languages as $language) {
if (sha1($new_file) != $existingSHA1 || !file_exists($mofile)) {
echo "Updating ".$code."\n";
file_put_contents($pofile, $new_file);
- system(sprintf('msgmerge -U %s %s', $pofile, $statusnet_pot));
+ // --backup=off is workaround for Mac OS X fail
+ system(sprintf('msgmerge -U --backup=off %s %s', $pofile, $statusnet_pot));
system(sprintf('msgfmt -f -o %s %s', $mofile, $pofile));
} else {
echo "Unchanged - ".$code."\n";
diff --git a/scripts/userrole.php b/scripts/userrole.php
new file mode 100644
index 000000000..7b6a9b3fd
--- /dev/null
+++ b/scripts/userrole.php
@@ -0,0 +1,85 @@
+#!/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__) . '/..'));
+
+$shortoptions = 'i:n:r:d';
+$longoptions = array('id=', 'nickname=', 'role=', 'delete');
+
+$helptext = <<<END_OF_USERROLE_HELP
+userrole.php [options]
+modifies a role for the given user
+
+ -d --delete delete the role
+ -i --id ID of the user
+ -n --nickname nickname of the user
+ -r --role role to add (or delete)
+
+END_OF_USERROLE_HELP;
+
+require_once INSTALLDIR.'/scripts/commandline.inc';
+
+if (have_option('i', 'id')) {
+ $id = get_option_value('i', 'id');
+ $user = User::staticGet('id', $id);
+ if (empty($user)) {
+ print "Can't find user with ID $id\n";
+ exit(1);
+ }
+} else if (have_option('n', 'nickname')) {
+ $nickname = get_option_value('n', 'nickname');
+ $user = User::staticGet('nickname', $nickname);
+ if (empty($user)) {
+ print "Can't find user with nickname '$nickname'\n";
+ exit(1);
+ }
+} else {
+ print "You must provide either an ID or a nickname.\n";
+ exit(1);
+}
+
+$role = get_option_value('r', 'role');
+
+if (empty($role)) {
+ print "You must provide a role.\n";
+ exit(1);
+}
+
+if (have_option('d', 'delete')) {
+ print "Revoking role '$role' from user '$user->nickname' ($user->id)...";
+ try {
+ $user->revokeRole($role);
+ print "OK\n";
+ } catch (Exception $e) {
+ print "FAIL\n";
+ print $e->getMessage();
+ print "\n";
+ }
+} else {
+ print "Granting role '$role' to user '$user->nickname' ($user->id)...";
+ try {
+ $user->grantRole($role);
+ print "OK\n";
+ } catch (Exception $e) {
+ print "FAIL\n";
+ print $e->getMessage();
+ print "\n";
+ }
+}
diff --git a/scripts/xmppconfirmhandler.php b/scripts/xmppconfirmhandler.php
index c7ed15e49..2e3974136 100755
--- a/scripts/xmppconfirmhandler.php
+++ b/scripts/xmppconfirmhandler.php
@@ -34,8 +34,6 @@ require_once INSTALLDIR.'/scripts/commandline.inc';
require_once INSTALLDIR . '/lib/jabber.php';
require_once INSTALLDIR . '/lib/xmppqueuehandler.php';
-define('CLAIM_TIMEOUT', 1200);
-
class XmppConfirmHandler extends XmppQueueHandler
{
var $_id = 'confirm';
diff --git a/scripts/xmppdaemon.php b/scripts/xmppdaemon.php
index 9e621e725..e52e2a6af 100755
--- a/scripts/xmppdaemon.php
+++ b/scripts/xmppdaemon.php
@@ -187,7 +187,7 @@ class XMPPDaemon extends Daemon
return;
}
if ($this->handle_command($user, $pl['body'])) {
- $this->log(LOG_INFO, "Command messag by $from handled.");
+ $this->log(LOG_INFO, "Command message by $from handled.");
return;
} else if ($this->is_autoreply($pl['body'])) {
$this->log(LOG_INFO, 'Ignoring auto reply from ' . $from);
@@ -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);