Merge branch '0.9.x' of git@gitorious.org:statusnet/mainline into 0.9.x-mobile
This commit is contained in:
commit
19edced6c2
65
EVENTS.txt
65
EVENTS.txt
|
@ -390,3 +390,68 @@ EndProfilePageProfileTags: after showing the tags on the profile page
|
|||
- $action: the current action
|
||||
- &$profile: the profile being shown
|
||||
|
||||
StartProfileList: when starting a list of profiles (before <ul>)
|
||||
- $profilelist: ProfileList widget, with $profile, $action, and $out
|
||||
|
||||
EndProfileList: when ending a list of profiles (after </ul>)
|
||||
- $profilelist: ProfileList widget
|
||||
|
||||
StartProfileListItem: when starting to show a profile list item
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
EndProfileListItem: after showing a profile list item
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
StartProfileListItemProfile: the profile data part of the item
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
EndProfileListItemProfile: the profile data part of the item
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
StartProfileListItemActions: the actions (buttons) for an item
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
EndProfileListItemActions: the actions (buttons) for an item
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
StartProfileListItemProfileElements: inside the <div>
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
EndProfileListItemProfileElements: inside the <div>
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
StartProfileListItemAvatar: Showing a profile list avatar
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
EndProfileListItemAvatar: Showing a profile list avatar
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
StartProfileListItemFullName: Showing the profile list full name
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
EndProfileListItemFullName: Showing the profile list full name
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
StartProfileListItemLocation: Showing the profile list location
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
EndProfileListItemLocation: Showing the profile list location
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
StartProfileListItemHomepage: Showing the profile list homepage
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
EndProfileListItemHomepage: Showing the profile list homepage
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
StartProfileListItemBio: Showing the profile list bio
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
EndProfileListItemBio: Showing the profile list bio
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
StartProfileListItemActionElements: Showing the profile list actions (prepend a button here, or replace all buttons)
|
||||
- $item: ProfileListItem widget
|
||||
|
||||
EndProfileListItemActionElements: Showing profile list actions (append a button here)
|
||||
- $item: ProfileListItem widget
|
||||
|
|
74
README
74
README
|
@ -2,7 +2,7 @@
|
|||
README
|
||||
------
|
||||
|
||||
StatusNet 0.8.1 ("Second Guessing")
|
||||
StatusNet 0.8.2 ("Life and How to Live It")
|
||||
26 Aug 2009
|
||||
|
||||
This is the README file for StatusNet (formerly Laconica), the Open
|
||||
|
@ -526,8 +526,6 @@ This will run eight (for now) queue handlers:
|
|||
of registered users.
|
||||
* xmppconfirmhandler.php - sends confirmation messages to registered
|
||||
users.
|
||||
* twitterqueuehandler.php - sends queued notices to Twitter for user
|
||||
who have opted to set up Twitter bridging.
|
||||
* facebookqueuehandler.php - sends queued notices to Facebook for users
|
||||
of the built-in Facebook application.
|
||||
|
||||
|
@ -547,54 +545,6 @@ our kind of hacky home-grown DB-based queue solution. See the "queues"
|
|||
config section below for how to configure to use STOMP. As of this
|
||||
writing, the software has been tested with ActiveMQ (
|
||||
|
||||
Twitter Bridge
|
||||
--------------
|
||||
|
||||
* OAuth
|
||||
|
||||
As of 0.8.1, OAuth is used to to access protected resources on Twitter
|
||||
instead of HTTP Basic Auth. To use Twitter bridging you will need
|
||||
to register your instance of StatusNet as an application on Twitter
|
||||
(http://twitter.com/apps), and update the following variables in your
|
||||
config.php with the consumer key and secret Twitter generates for you:
|
||||
|
||||
$config['twitter']['consumer_key'] = 'YOURKEY';
|
||||
$config['twitter']['consumer_secret'] = 'YOURSECRET';
|
||||
|
||||
When registering your application with Twitter set the type to "Browser"
|
||||
and your Callback URL to:
|
||||
|
||||
http://example.org/mublog/twitter/authorization
|
||||
|
||||
The default access type should be, "Read & Write".
|
||||
|
||||
* Importing statuses from Twitter
|
||||
|
||||
To allow your users to import their friends' Twitter statuses, you will
|
||||
need to enable the bidirectional Twitter bridge in config.php:
|
||||
|
||||
$config['twitterbridge']['enabled'] = true;
|
||||
|
||||
and run the TwitterStatusFetcher daemon (scripts/twitterstatusfetcher.php).
|
||||
Additionally, you will want to set the integration source variable,
|
||||
which will keep notices posted to Twitter via StatusNet from looping
|
||||
back. The integration source should be set to the name of your
|
||||
application, exactly as you specified it on the settings page for your
|
||||
StatusNet application on Twitter, e.g.:
|
||||
|
||||
$config['integration']['source'] = 'YourApp';
|
||||
|
||||
* Twitter Friends Syncing
|
||||
|
||||
Users may set a flag in their settings ("Subscribe to my Twitter friends
|
||||
here" under the Twitter tab) to have StatusNet attempt to locate and
|
||||
subscribe to "friends" (people they "follow") on Twitter who also have
|
||||
accounts on your StatusNet system, and who have previously set up a link
|
||||
for automatically posting notices to Twitter.
|
||||
|
||||
As of 0.8.0, this is no longer accomplished via a cron job. Instead you
|
||||
must run the SyncTwitterFriends daemon (scripts/synctwitterfreinds.php).
|
||||
|
||||
Built-in Facebook Application
|
||||
-----------------------------
|
||||
|
||||
|
@ -1251,24 +1201,11 @@ For SMS integration.
|
|||
enabled: Whether to enable SMS integration. Defaults to true. Queues
|
||||
should also be enabled.
|
||||
|
||||
twitter
|
||||
-------
|
||||
|
||||
For Twitter integration
|
||||
|
||||
enabled: Whether to enable Twitter integration. Defaults to true.
|
||||
Queues should also be enabled.
|
||||
|
||||
integration
|
||||
-----------
|
||||
|
||||
A catch-all for integration with other systems.
|
||||
|
||||
source: The name to use for the source of posts to Twitter. Defaults
|
||||
to 'statusnet', but if you request your own source name from
|
||||
Twitter <http://twitter.com/help/request_source>, you can use
|
||||
that here instead. Status updates on Twitter will then have
|
||||
links to your site.
|
||||
taguri: base for tag:// URIs. Defaults to site-server + ',2009'.
|
||||
|
||||
inboxes
|
||||
|
@ -1446,15 +1383,6 @@ dir: directory to write backgrounds too. Default is '/background/'
|
|||
path: path to backgrounds. Default is sub-path of install path; note
|
||||
that you may need to change this if you change site-path too.
|
||||
|
||||
twitterbridge
|
||||
-------------
|
||||
|
||||
A bi-direction bridge to Twitter (http://twitter.com/).
|
||||
|
||||
enabled: default false. If true, will show user's Twitter friends'
|
||||
notices in their inbox and faves pages, only to the user. You
|
||||
must also run the twitterstatusfetcher.php script.
|
||||
|
||||
ping
|
||||
----
|
||||
|
||||
|
|
|
@ -179,9 +179,12 @@ class GroupMemberListItem extends ProfileListItem
|
|||
function showActions()
|
||||
{
|
||||
$this->startActions();
|
||||
$this->showSubscribeButton();
|
||||
$this->showMakeAdminForm();
|
||||
$this->showGroupBlockForm();
|
||||
if (Event::handle('StartProfileListItemActionElements', array($this))) {
|
||||
$this->showSubscribeButton();
|
||||
$this->showMakeAdminForm();
|
||||
$this->showGroupBlockForm();
|
||||
Event::handle('EndProfileListItemActionElements', array($this));
|
||||
}
|
||||
$this->endActions();
|
||||
}
|
||||
|
||||
|
|
|
@ -81,7 +81,7 @@ class Avatar extends Memcached_DataObject
|
|||
if (empty($server)) {
|
||||
$server = common_config('site', 'server');
|
||||
}
|
||||
|
||||
common_debug('path = ' . $path);
|
||||
// XXX: protocol
|
||||
|
||||
return 'http://'.$server.$path.$filename;
|
||||
|
|
|
@ -235,7 +235,7 @@ class DB_DataObject extends DB_DataObject_Overload
|
|||
* @access private
|
||||
* @var string
|
||||
*/
|
||||
var $_DB_DataObject_version = "1.8.11";
|
||||
var $_DB_DataObject_version = "1.8.12";
|
||||
|
||||
/**
|
||||
* The Database table (used by table extends)
|
||||
|
|
|
@ -6,9 +6,9 @@
|
|||
*
|
||||
* PHP versions 4 and 5
|
||||
*
|
||||
* LICENSE: This source file is subject to version 3.0 of the PHP license
|
||||
* LICENSE: This source file is subject to version 3.01 of the PHP license
|
||||
* that is available through the world-wide-web at the following URI:
|
||||
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
|
||||
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
|
||||
* the PHP License and are unable to obtain it through the web, please
|
||||
* send a note to license@php.net so we can mail you a copy immediately.
|
||||
*
|
||||
|
@ -16,8 +16,8 @@
|
|||
* @package DB_DataObject
|
||||
* @author Alan Knowles <alan@akbkhome.com>
|
||||
* @copyright 1997-2008 The PHP Group
|
||||
* @license http://www.php.net/license/3_0.txt PHP License 3.0
|
||||
* @version CVS: $Id: Cast.php 264148 2008-08-04 03:44:59Z alan_k $
|
||||
* @license http://www.php.net/license/3_01.txt PHP License 3.01
|
||||
* @version CVS: $Id: Cast.php 287158 2009-08-12 13:58:31Z alan_k $
|
||||
* @link http://pear.php.net/package/DB_DataObject
|
||||
*/
|
||||
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
*
|
||||
* PHP versions 4 and 5
|
||||
*
|
||||
* LICENSE: This source file is subject to version 3.0 of the PHP license
|
||||
* LICENSE: This source file is subject to version 3.01 of the PHP license
|
||||
* that is available through the world-wide-web at the following URI:
|
||||
* http://www.php.net/license/3_0.txt. If you did not receive a copy of
|
||||
* http://www.php.net/license/3_01.txt. If you did not receive a copy of
|
||||
* the PHP License and are unable to obtain it through the web, please
|
||||
* send a note to license@php.net so we can mail you a copy immediately.
|
||||
*
|
||||
|
@ -17,8 +17,8 @@
|
|||
* @package DB_DataObject
|
||||
* @author Alan Knowles <alan@akbkhome.com>
|
||||
* @copyright 1997-2006 The PHP Group
|
||||
* @license http://www.php.net/license/3_0.txt PHP License 3.0
|
||||
* @version CVS: $Id: Error.php 277015 2009-03-12 05:51:03Z alan_k $
|
||||
* @license http://www.php.net/license/3_01.txt PHP License 3.01
|
||||
* @version CVS: $Id: Error.php 287158 2009-08-12 13:58:31Z alan_k $
|
||||
* @link http://pear.php.net/package/DB_DataObject
|
||||
*/
|
||||
|
||||
|
|
|
@ -129,7 +129,7 @@ function _setlocale($category, $locale) {
|
|||
$ret = 0;
|
||||
if (function_exists('setlocale')) // I don't know if this ever happens ;)
|
||||
$ret = setlocale($category, $locale);
|
||||
if (($ret and $locale == '') or ($ret == $locale)) {
|
||||
if ($ret and ($locale == '' or $ret == $locale)) {
|
||||
$EMULATEGETTEXT = 0;
|
||||
$CURRENTLOCALE = $ret;
|
||||
} else {
|
||||
|
|
|
@ -223,7 +223,6 @@ require_once INSTALLDIR.'/lib/theme.php';
|
|||
require_once INSTALLDIR.'/lib/mail.php';
|
||||
require_once INSTALLDIR.'/lib/subs.php';
|
||||
require_once INSTALLDIR.'/lib/Shorturl_api.php';
|
||||
require_once INSTALLDIR.'/lib/twitter.php';
|
||||
|
||||
require_once INSTALLDIR.'/lib/clientexception.php';
|
||||
require_once INSTALLDIR.'/lib/serverexception.php';
|
||||
|
|
|
@ -98,34 +98,37 @@ class ConnectSettingsNav extends Widget
|
|||
|
||||
function show()
|
||||
{
|
||||
# action => array('prompt', 'title')
|
||||
$menu = array();
|
||||
if (common_config('xmpp', 'enabled')) {
|
||||
$menu['imsettings'] =
|
||||
array(_('IM'),
|
||||
_('Updates by instant messenger (IM)'));
|
||||
}
|
||||
if (common_config('sms', 'enabled')) {
|
||||
$menu['smssettings'] =
|
||||
array(_('SMS'),
|
||||
_('Updates by SMS'));
|
||||
}
|
||||
if (common_config('twitter', 'enabled')) {
|
||||
$menu['twittersettings'] =
|
||||
array(_('Twitter'),
|
||||
_('Twitter integration options'));
|
||||
}
|
||||
|
||||
$action_name = $this->action->trimmed('action');
|
||||
$this->action->elementStart('ul', array('class' => 'nav'));
|
||||
|
||||
foreach ($menu as $menuaction => $menudesc) {
|
||||
$this->action->menuItem(common_local_url($menuaction),
|
||||
$menudesc[0],
|
||||
$menudesc[1],
|
||||
$action_name === $menuaction);
|
||||
if (Event::handle('StartConnectSettingsNav', array(&$this->action))) {
|
||||
|
||||
# action => array('prompt', 'title')
|
||||
$menu = array();
|
||||
if (common_config('xmpp', 'enabled')) {
|
||||
$menu['imsettings'] =
|
||||
array(_('IM'),
|
||||
_('Updates by instant messenger (IM)'));
|
||||
}
|
||||
if (common_config('sms', 'enabled')) {
|
||||
$menu['smssettings'] =
|
||||
array(_('SMS'),
|
||||
_('Updates by SMS'));
|
||||
}
|
||||
|
||||
foreach ($menu as $menuaction => $menudesc) {
|
||||
$this->action->menuItem(common_local_url($menuaction),
|
||||
$menudesc[0],
|
||||
$menudesc[1],
|
||||
$action_name === $menuaction);
|
||||
}
|
||||
|
||||
Event::handle('EndConnectSettingsNav', array(&$this->action));
|
||||
}
|
||||
|
||||
$this->action->elementEnd('ul');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -140,21 +140,21 @@ $default =
|
|||
array('enabled' => true),
|
||||
'sms' =>
|
||||
array('enabled' => true),
|
||||
'twitterbridge' =>
|
||||
'twitterimport' =>
|
||||
array('enabled' => false),
|
||||
'integration' =>
|
||||
array('source' => 'StatusNet', # source attribute for Twitter
|
||||
'taguri' => $_server.',2009'), # base for tag URIs
|
||||
'twitter' =>
|
||||
array('enabled' => true,
|
||||
'consumer_key' => null,
|
||||
'consumer_secret' => null),
|
||||
'twitter' =>
|
||||
array('enabled' => true,
|
||||
'consumer_key' => null,
|
||||
'consumer_secret' => null),
|
||||
'memcached' =>
|
||||
array('enabled' => false,
|
||||
'server' => 'localhost',
|
||||
'base' => null,
|
||||
'port' => 11211),
|
||||
'ping' =>
|
||||
'ping' =>
|
||||
array('notify' => array()),
|
||||
'inboxes' =>
|
||||
array('enabled' => true), # ignored after 0.9.x
|
||||
|
@ -200,12 +200,12 @@ $default =
|
|||
'video/mp4',
|
||||
'video/quicktime',
|
||||
'video/mpeg'),
|
||||
'file_quota' => 5000000,
|
||||
'user_quota' => 50000000,
|
||||
'monthly_quota' => 15000000,
|
||||
'uploads' => true,
|
||||
'filecommand' => '/usr/bin/file',
|
||||
),
|
||||
'file_quota' => 5000000,
|
||||
'user_quota' => 50000000,
|
||||
'monthly_quota' => 15000000,
|
||||
'uploads' => true,
|
||||
'filecommand' => '/usr/bin/file',
|
||||
),
|
||||
'group' =>
|
||||
array('maxaliases' => 3,
|
||||
'desclimit' => null),
|
||||
|
|
|
@ -48,7 +48,7 @@ if (!defined('STATUSNET')) {
|
|||
class HTTPResponse
|
||||
{
|
||||
public $code = null;
|
||||
public $headers = null;
|
||||
public $headers = array();
|
||||
public $body = null;
|
||||
}
|
||||
|
||||
|
|
|
@ -101,35 +101,36 @@ function get_nice_language_list()
|
|||
*/
|
||||
function get_all_languages() {
|
||||
return array(
|
||||
'bg' => array('q' => 0.8, 'lang' => 'bg_BG', 'name' => 'Bulgarian', 'direction' => 'ltr'),
|
||||
'ca' => array('q' => 0.5, 'lang' => 'ca_ES', 'name' => 'Catalan', 'direction' => 'ltr'),
|
||||
'cs' => array('q' => 0.5, 'lang' => 'cs_CZ', 'name' => 'Czech', 'direction' => 'ltr'),
|
||||
'de' => array('q' => 0.8, 'lang' => 'de_DE', 'name' => 'German', 'direction' => 'ltr'),
|
||||
'bg' => array('q' => 0.8, 'lang' => 'bg', 'name' => 'Bulgarian', 'direction' => 'ltr'),
|
||||
'ca' => array('q' => 0.5, 'lang' => 'ca', 'name' => 'Catalan', 'direction' => 'ltr'),
|
||||
'cs' => array('q' => 0.5, 'lang' => 'cs', 'name' => 'Czech', 'direction' => 'ltr'),
|
||||
'de' => array('q' => 0.8, 'lang' => 'de', 'name' => 'German', 'direction' => 'ltr'),
|
||||
'el' => array('q' => 0.1, 'lang' => 'el', 'name' => 'Greek', 'direction' => 'ltr'),
|
||||
'en-us' => array('q' => 1, 'lang' => 'en_US', 'name' => 'English (US)', 'direction' => 'ltr'),
|
||||
'en-us' => array('q' => 1, 'lang' => 'en', 'name' => 'English (US)', 'direction' => 'ltr'),
|
||||
'en-gb' => array('q' => 1, 'lang' => 'en_GB', 'name' => 'English (British)', 'direction' => 'ltr'),
|
||||
'en' => array('q' => 1, 'lang' => 'en_US', 'name' => 'English (US)', 'direction' => 'ltr'),
|
||||
'en' => array('q' => 1, 'lang' => 'en', 'name' => 'English (US)', 'direction' => 'ltr'),
|
||||
'es' => array('q' => 1, 'lang' => 'es', 'name' => 'Spanish', 'direction' => 'ltr'),
|
||||
'fi' => array('q' => 1, 'lang' => 'fi', 'name' => 'Finnish', 'direction' => 'ltr'),
|
||||
'fr-fr' => array('q' => 1, 'lang' => 'fr_FR', 'name' => 'French', 'direction' => 'ltr'),
|
||||
'he' => array('q' => 0.5, 'lang' => 'he_IL', 'name' => 'Hebrew', 'direction' => 'rtl'),
|
||||
'it' => array('q' => 1, 'lang' => 'it_IT', 'name' => 'Italian', 'direction' => 'ltr'),
|
||||
'jp' => array('q' => 0.5, 'lang' => 'ja_JP', 'name' => 'Japanese', 'direction' => 'ltr'),
|
||||
'ko' => array('q' => 0.9, 'lang' => 'ko_KR', 'name' => 'Korean', 'direction' => 'ltr'),
|
||||
'mk' => array('q' => 0.5, 'lang' => 'mk_MK', 'name' => 'Macedonian', 'direction' => 'ltr'),
|
||||
'nb' => array('q' => 0.1, 'lang' => 'nb_NO', 'name' => 'Norwegian (Bokmål)', 'direction' => 'ltr'),
|
||||
'no' => array('q' => 0.1, 'lang' => 'nb_NO', 'name' => 'Norwegian (Bokmål)', 'direction' => 'ltr'),
|
||||
'nn' => array('q' => 1, 'lang' => 'nn_NO', 'name' => 'Norwegian (Nynorsk)', 'direction' => 'ltr'),
|
||||
'nl' => array('q' => 0.5, 'lang' => 'nl_NL', 'name' => 'Dutch', 'direction' => 'ltr'),
|
||||
'pl' => array('q' => 0.5, 'lang' => 'pl_PL', 'name' => 'Polish', 'direction' => 'ltr'),
|
||||
'fr-fr' => array('q' => 1, 'lang' => 'fr', 'name' => 'French', 'direction' => 'ltr'),
|
||||
'ga' => array('q' => 0.5, 'lang' => 'ga', 'name' => 'Galician', 'direction' => 'ltr'),
|
||||
'he' => array('q' => 0.5, 'lang' => 'he', 'name' => 'Hebrew', 'direction' => 'rtl'),
|
||||
'it' => array('q' => 1, 'lang' => 'it', 'name' => 'Italian', 'direction' => 'ltr'),
|
||||
'jp' => array('q' => 0.5, 'lang' => 'ja', 'name' => 'Japanese', 'direction' => 'ltr'),
|
||||
'ko' => array('q' => 0.9, 'lang' => 'ko', 'name' => 'Korean', 'direction' => 'ltr'),
|
||||
'mk' => array('q' => 0.5, 'lang' => 'mk', 'name' => 'Macedonian', 'direction' => 'ltr'),
|
||||
'nb' => array('q' => 0.1, 'lang' => 'nb', 'name' => 'Norwegian (Bokmål)', 'direction' => 'ltr'),
|
||||
'no' => array('q' => 0.1, 'lang' => 'nb', 'name' => 'Norwegian (Bokmål)', 'direction' => 'ltr'),
|
||||
'nn' => array('q' => 1, 'lang' => 'nn', 'name' => 'Norwegian (Nynorsk)', 'direction' => 'ltr'),
|
||||
'nl' => array('q' => 0.5, 'lang' => 'nl', 'name' => 'Dutch', 'direction' => 'ltr'),
|
||||
'pl' => array('q' => 0.5, 'lang' => 'pl', 'name' => 'Polish', 'direction' => 'ltr'),
|
||||
'pt' => array('q' => 0.1, 'lang' => 'pt', 'name' => 'Portuguese', 'direction' => 'ltr'),
|
||||
'pt-br' => array('q' => 0.9, 'lang' => 'pt_BR', 'name' => 'Portuguese Brazil', 'direction' => 'ltr'),
|
||||
'ru' => array('q' => 0.9, 'lang' => 'ru_RU', 'name' => 'Russian', 'direction' => 'ltr'),
|
||||
'sv' => array('q' => 0.8, 'lang' => 'sv_SE', 'name' => 'Swedish', 'direction' => 'ltr'),
|
||||
'te' => array('q' => 0.3, 'lang' => 'te_IN', 'name' => 'Telugu', 'direction' => 'ltr'),
|
||||
'tr' => array('q' => 0.5, 'lang' => 'tr_TR', 'name' => 'Turkish', 'direction' => 'ltr'),
|
||||
'uk' => array('q' => 1, 'lang' => 'uk_UA', 'name' => 'Ukrainian', 'direction' => 'ltr'),
|
||||
'vi' => array('q' => 0.8, 'lang' => 'vi_VN', 'name' => 'Vietnamese', 'direction' => 'ltr'),
|
||||
'ru' => array('q' => 0.9, 'lang' => 'ru', 'name' => 'Russian', 'direction' => 'ltr'),
|
||||
'sv' => array('q' => 0.8, 'lang' => 'sv', 'name' => 'Swedish', 'direction' => 'ltr'),
|
||||
'te' => array('q' => 0.3, 'lang' => 'te', 'name' => 'Telugu', 'direction' => 'ltr'),
|
||||
'tr' => array('q' => 0.5, 'lang' => 'tr', 'name' => 'Turkish', 'direction' => 'ltr'),
|
||||
'uk' => array('q' => 1, 'lang' => 'uk', 'name' => 'Ukrainian', 'direction' => 'ltr'),
|
||||
'vi' => array('q' => 0.8, 'lang' => 'vi', 'name' => 'Vietnamese', 'direction' => 'ltr'),
|
||||
'zh-cn' => array('q' => 0.9, 'lang' => 'zh_CN', 'name' => 'Chinese (Simplified)', 'direction' => 'ltr'),
|
||||
'zh-hant' => array('q' => 0.2, 'lang' => 'zh_TW', 'name' => 'Chinese (Taiwanese)', 'direction' => 'ltr'),
|
||||
);
|
||||
|
|
|
@ -62,9 +62,15 @@ class ProfileList extends Widget
|
|||
|
||||
function show()
|
||||
{
|
||||
$this->startList();
|
||||
$cnt = $this->showProfiles();
|
||||
$this->endList();
|
||||
$cnt = 0;
|
||||
|
||||
if (Event::handle('StartProfileList', array($this))) {
|
||||
$this->startList();
|
||||
$cnt = $this->showProfiles();
|
||||
$this->endList();
|
||||
Event::handle('EndProfileList', array($this));
|
||||
}
|
||||
|
||||
return $cnt;
|
||||
}
|
||||
|
||||
|
@ -117,10 +123,19 @@ class ProfileListItem extends Widget
|
|||
|
||||
function show()
|
||||
{
|
||||
$this->startItem();
|
||||
$this->showProfile();
|
||||
$this->showActions();
|
||||
$this->endItem();
|
||||
if (Event::handle('StartProfileListItem', array($this))) {
|
||||
$this->startItem();
|
||||
if (Event::handle('StartProfileListItemProfile', array($this))) {
|
||||
$this->showProfile();
|
||||
Event::handle('EndProfileListItemProfile', array($this));
|
||||
}
|
||||
if (Event::handle('StartProfileListItemActions', array($this))) {
|
||||
$this->showActions();
|
||||
Event::handle('EndProfileListItemActions', array($this));
|
||||
}
|
||||
$this->endItem();
|
||||
Event::handle('EndProfileListItem', array($this));
|
||||
}
|
||||
}
|
||||
|
||||
function startItem()
|
||||
|
@ -132,11 +147,29 @@ class ProfileListItem extends Widget
|
|||
function showProfile()
|
||||
{
|
||||
$this->startProfile();
|
||||
$this->showAvatar();
|
||||
$this->showFullName();
|
||||
$this->showLocation();
|
||||
$this->showHomepage();
|
||||
$this->showBio();
|
||||
if (Event::handle('StartProfileListItemProfileElements', array($this))) {
|
||||
if (Event::handle('StartProfileListItemAvatar', array($this))) {
|
||||
$this->showAvatar();
|
||||
Event::handle('EndProfileListItemAvatar', array($this));
|
||||
}
|
||||
if (Event::handle('StartProfileListItemFullName', array($this))) {
|
||||
$this->showFullName();
|
||||
Event::handle('EndProfileListItemFullName', array($this));
|
||||
}
|
||||
if (Event::handle('StartProfileListItemLocation', array($this))) {
|
||||
$this->showLocation();
|
||||
Event::handle('EndProfileListItemLocation', array($this));
|
||||
}
|
||||
if (Event::handle('StartProfileListItemHomepage', array($this))) {
|
||||
$this->showHomepage();
|
||||
Event::handle('EndProfileListItemHomepage', array($this));
|
||||
}
|
||||
if (Event::handle('StartProfileListItemBio', array($this))) {
|
||||
$this->showBio();
|
||||
Event::handle('EndProfileListItemBio', array($this));
|
||||
}
|
||||
Event::handle('EndProfileListItemProfileElements', array($this));
|
||||
}
|
||||
$this->endProfile();
|
||||
}
|
||||
|
||||
|
@ -225,7 +258,10 @@ class ProfileListItem extends Widget
|
|||
function showActions()
|
||||
{
|
||||
$this->startActions();
|
||||
$this->showSubscribeButton();
|
||||
if (Event::handle('StartProfileListItemActionElements', array($this))) {
|
||||
$this->showSubscribeButton();
|
||||
Event::handle('EndProfileListItemActionElements', array($this));
|
||||
}
|
||||
$this->endActions();
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,22 @@ define('CLAIM_TIMEOUT', 1200);
|
|||
define('QUEUE_HANDLER_MISS_IDLE', 10);
|
||||
define('QUEUE_HANDLER_HIT_IDLE', 0);
|
||||
|
||||
/**
|
||||
* Base class for queue handlers.
|
||||
*
|
||||
* As extensions of the Daemon class, each queue handler has the ability
|
||||
* to launch itself in the background, at which point it'll pass control
|
||||
* to the configured QueueManager class to poll for updates.
|
||||
*
|
||||
* Subclasses must override at least the following methods:
|
||||
* - transport
|
||||
* - start
|
||||
* - finish
|
||||
* - handle_notice
|
||||
*
|
||||
* Some subclasses will also want to override the idle handler:
|
||||
* - idle
|
||||
*/
|
||||
class QueueHandler extends Daemon
|
||||
{
|
||||
|
||||
|
@ -39,6 +55,14 @@ class QueueHandler extends Daemon
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* How many seconds a polling-based queue manager should wait between
|
||||
* checks for new items to handle.
|
||||
*
|
||||
* Defaults to 60 seconds; override to speed up or slow down.
|
||||
*
|
||||
* @return int timeout in seconds
|
||||
*/
|
||||
function timeout()
|
||||
{
|
||||
return 60;
|
||||
|
@ -54,24 +78,69 @@ class QueueHandler extends Daemon
|
|||
return strtolower($this->class_name().'.'.$this->get_id());
|
||||
}
|
||||
|
||||
/**
|
||||
* Return transport keyword which identifies items this queue handler
|
||||
* services; must be defined for all subclasses.
|
||||
*
|
||||
* Must be 8 characters or less to fit in the queue_item database.
|
||||
* ex "email", "jabber", "sms", "irc", ...
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function transport()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialization, run when the queue handler starts.
|
||||
* If this function indicates failure, the handler run will be aborted.
|
||||
*
|
||||
* @fixme run() will abort if this doesn't return true,
|
||||
* but some subclasses don't bother.
|
||||
* @return boolean true on success, false on failure
|
||||
*/
|
||||
function start()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleanup, run when the queue handler ends.
|
||||
* If this function indicates failure, a warning will be logged.
|
||||
*
|
||||
* @fixme run() will throw warnings if this doesn't return true,
|
||||
* but many subclasses don't bother.
|
||||
* @return boolean true on success, false on failure
|
||||
*/
|
||||
function finish()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Here's the meat of your queue handler -- you're handed a Notice
|
||||
* object, which you may do as you will with.
|
||||
*
|
||||
* If this function indicates failure, a warning will be logged
|
||||
* and the item is placed back in the queue to be re-run.
|
||||
*
|
||||
* @param Notice $notice
|
||||
* @return boolean true on success, false on failure
|
||||
*/
|
||||
function handle_notice($notice)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup and start of run loop for this queue handler as a daemon.
|
||||
* Most of the heavy lifting is passed on to the QueueManager's service()
|
||||
* method, which passes control back to our handle_notice() method for
|
||||
* each notice that comes in on the queue.
|
||||
*
|
||||
* Most of the time this won't need to be overridden in a subclass.
|
||||
*
|
||||
* @return boolean true on success, false on failure
|
||||
*/
|
||||
function run()
|
||||
{
|
||||
if (!$this->start()) {
|
||||
|
@ -100,6 +169,14 @@ class QueueHandler extends Daemon
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by QueueHandler after each handled item or empty polling cycle.
|
||||
* This is a good time to e.g. service your XMPP connection.
|
||||
*
|
||||
* Doesn't need to be overridden if there's no maintenance to do.
|
||||
*
|
||||
* @param int $timeout seconds to sleep if there's nothing to do
|
||||
*/
|
||||
function idle($timeout=0)
|
||||
{
|
||||
if ($timeout > 0) {
|
||||
|
|
|
@ -86,10 +86,6 @@ class Router
|
|||
|
||||
$m->connect('doc/:title', array('action' => 'doc'));
|
||||
|
||||
// Twitter
|
||||
|
||||
$m->connect('twitter/authorization', array('action' => 'twitterauthorization'));
|
||||
|
||||
// facebook
|
||||
|
||||
$m->connect('facebook', array('action' => 'facebookhome'));
|
||||
|
@ -136,7 +132,7 @@ class Router
|
|||
// settings
|
||||
|
||||
foreach (array('profile', 'avatar', 'password', 'im',
|
||||
'email', 'sms', 'twitter', 'userdesign', 'other') as $s) {
|
||||
'email', 'sms', 'userdesign', 'other') as $s) {
|
||||
$m->connect('settings/'.$s, array('action' => $s.'settings'));
|
||||
}
|
||||
|
||||
|
|
|
@ -48,11 +48,6 @@ class UnQueueManager
|
|||
jabber_public_notice($notice);
|
||||
}
|
||||
break;
|
||||
case 'twitter':
|
||||
if ($this->_isLocal($notice)) {
|
||||
broadcast_twitter($notice);
|
||||
}
|
||||
break;
|
||||
case 'facebook':
|
||||
if ($this->_isLocal($notice)) {
|
||||
require_once INSTALLDIR . '/lib/facebookutil.php';
|
||||
|
|
18
lib/util.php
18
lib/util.php
|
@ -51,13 +51,23 @@ function common_init_locale($language=null)
|
|||
function common_init_language()
|
||||
{
|
||||
mb_internal_encoding('UTF-8');
|
||||
|
||||
// gettext seems very picky... We first need to setlocale()
|
||||
// to a locale which _does_ exist on the system, and _then_
|
||||
// we can set in another locale that may not be set up
|
||||
// (say, ga_ES for Galego/Galician) it seems to take it.
|
||||
common_init_locale("en_US");
|
||||
|
||||
$language = common_language();
|
||||
// So we don't have to make people install the gettext locales
|
||||
$locale_set = common_init_locale($language);
|
||||
bindtextdomain("statusnet", common_config('site','locale_path'));
|
||||
setlocale(LC_CTYPE, 'C');
|
||||
|
||||
// So we don't have to make people install the gettext locales
|
||||
$path = common_config('site','locale_path');
|
||||
bindtextdomain("statusnet", $path);
|
||||
bind_textdomain_codeset("statusnet", "UTF-8");
|
||||
textdomain("statusnet");
|
||||
setlocale(LC_CTYPE, 'C');
|
||||
|
||||
if(!$locale_set) {
|
||||
common_log(LOG_INFO, 'Language requested:' . $language . ' - locale could not be set. Perhaps that system locale is not installed.', __FILE__);
|
||||
}
|
||||
|
@ -391,7 +401,7 @@ function common_render_content($text, $notice)
|
|||
{
|
||||
$r = common_render_text($text);
|
||||
$id = $notice->profile_id;
|
||||
$r = preg_replace('/(^|[\s\.\,\:\;]+)@([A-Za-z0-9]{1,64})/e', "'\\1@'.common_at_link($id, '\\2')", $r);
|
||||
$r = preg_replace('/(^|\s+)@(['.NICKNAME_FMT.']{1,64})/e', "'\\1@'.common_at_link($id, '\\2')", $r);
|
||||
$r = preg_replace('/^T ([A-Z0-9]{1,64}) /e', "'T '.common_at_link($id, '\\1').' '", $r);
|
||||
$r = preg_replace('/(^|[\s\.\,\:\;]+)@#([A-Za-z0-9]{1,64})/e', "'\\1@#'.common_at_hash_link($id, '\\2')", $r);
|
||||
$r = preg_replace('/(^|[\s\.\,\:\;]+)!([A-Za-z0-9]{1,64})/e', "'\\1!'.common_group_link($id, '\\2')", $r);
|
||||
|
|
BIN
locale/bg/LC_MESSAGES/statusnet.mo
Normal file
BIN
locale/bg/LC_MESSAGES/statusnet.mo
Normal file
Binary file not shown.
Binary file not shown.
BIN
locale/cs/LC_MESSAGES/statusnet.mo
Normal file
BIN
locale/cs/LC_MESSAGES/statusnet.mo
Normal file
Binary file not shown.
Binary file not shown.
BIN
locale/de/LC_MESSAGES/statusnet.mo
Normal file
BIN
locale/de/LC_MESSAGES/statusnet.mo
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
locale/fr/LC_MESSAGES/statusnet.mo
Normal file
BIN
locale/fr/LC_MESSAGES/statusnet.mo
Normal file
Binary file not shown.
Binary file not shown.
BIN
locale/ga/LC_MESSAGES/statusnet.mo
Normal file
BIN
locale/ga/LC_MESSAGES/statusnet.mo
Normal file
Binary file not shown.
4713
locale/ga/LC_MESSAGES/statusnet.po
Normal file
4713
locale/ga/LC_MESSAGES/statusnet.po
Normal file
File diff suppressed because it is too large
Load Diff
BIN
locale/is/LC_MESSAGES/statusnet.mo
Normal file
BIN
locale/is/LC_MESSAGES/statusnet.mo
Normal file
Binary file not shown.
BIN
locale/it/LC_MESSAGES/statusnet.mo
Normal file
BIN
locale/it/LC_MESSAGES/statusnet.mo
Normal file
Binary file not shown.
Binary file not shown.
BIN
locale/ja/LC_MESSAGES/statusnet.mo
Normal file
BIN
locale/ja/LC_MESSAGES/statusnet.mo
Normal file
Binary file not shown.
Binary file not shown.
BIN
locale/mk/LC_MESSAGES/statusnet.mo
Normal file
BIN
locale/mk/LC_MESSAGES/statusnet.mo
Normal file
Binary file not shown.
|
@ -4670,12 +4670,12 @@ msgstr "%1$s сега ги следи вашите забелешки за %2$s.
|
|||
#: lib/mail.php:254
|
||||
#, fuzzy, php-format
|
||||
msgid "Location: %s\n"
|
||||
msgstr "Локација"
|
||||
msgstr ""
|
||||
|
||||
#: lib/mail.php:256
|
||||
#, fuzzy, php-format
|
||||
msgid "Homepage: %s\n"
|
||||
msgstr "Домашна страница"
|
||||
msgstr ""
|
||||
|
||||
#: lib/mail.php:258
|
||||
#, php-format
|
Binary file not shown.
BIN
locale/nl/LC_MESSAGES/statusnet.mo
Normal file
BIN
locale/nl/LC_MESSAGES/statusnet.mo
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
locale/sv/LC_MESSAGES/statusnet.mo
Normal file
BIN
locale/sv/LC_MESSAGES/statusnet.mo
Normal file
Binary file not shown.
Binary file not shown.
BIN
locale/te/LC_MESSAGES/statusnet.mo
Normal file
BIN
locale/te/LC_MESSAGES/statusnet.mo
Normal file
Binary file not shown.
Binary file not shown.
BIN
locale/tr/LC_MESSAGES/statusnet.mo
Normal file
BIN
locale/tr/LC_MESSAGES/statusnet.mo
Normal file
Binary file not shown.
|
@ -4676,13 +4676,13 @@ msgstr "%1$s %2$s'da durumunuzu takip ediyor"
|
|||
#: lib/mail.php:254
|
||||
#, fuzzy, php-format
|
||||
msgid "Location: %s\n"
|
||||
msgstr "Yer"
|
||||
msgstr ""
|
||||
|
||||
# Belki Durum Merkezi falan denebilir mi ki?
|
||||
#: lib/mail.php:256
|
||||
#, fuzzy, php-format
|
||||
msgid "Homepage: %s\n"
|
||||
msgstr "Başlangıç Sayfası"
|
||||
msgstr ""
|
||||
|
||||
#: lib/mail.php:258
|
||||
#, php-format
|
Binary file not shown.
BIN
locale/vi/LC_MESSAGES/statusnet.mo
Normal file
BIN
locale/vi/LC_MESSAGES/statusnet.mo
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -4563,12 +4563,12 @@ msgstr "現在%1$s在%2$s成為你的粉絲囉"
|
|||
#: lib/mail.php:254
|
||||
#, fuzzy, php-format
|
||||
msgid "Location: %s\n"
|
||||
msgstr "地點"
|
||||
msgstr ""
|
||||
|
||||
#: lib/mail.php:256
|
||||
#, fuzzy, php-format
|
||||
msgid "Homepage: %s\n"
|
||||
msgstr "個人首頁"
|
||||
msgstr ""
|
||||
|
||||
#: lib/mail.php:258
|
||||
#, php-format
|
||||
|
|
|
@ -115,26 +115,48 @@ class FBConnectPlugin extends Plugin
|
|||
// XXX: Facebook says we don't need this FB_RequireFeatures(),
|
||||
// but we actually do, for IE and Safari. Gar.
|
||||
|
||||
$html = sprintf('<script type="text/javascript">
|
||||
$(document).ready(function () {
|
||||
FB_RequireFeatures(
|
||||
["XFBML"],
|
||||
function() {
|
||||
FB.init("%s", "../xd_receiver.html");
|
||||
}
|
||||
); });
|
||||
$js = '<script type="text/javascript">';
|
||||
$js .= ' $(document).ready(function () {';
|
||||
$js .= ' FB_RequireFeatures(';
|
||||
$js .= ' ["XFBML"], function() {';
|
||||
$js .= ' FB.init("%1$s", "../xd_receiver.html");';
|
||||
$js .= ' }';
|
||||
$js .= ' );';
|
||||
$js .= ' });';
|
||||
|
||||
function goto_login() {
|
||||
window.location = "%s";
|
||||
}
|
||||
$js .= ' function goto_login() {';
|
||||
$js .= ' window.location = "%2$s";';
|
||||
$js .= ' }';
|
||||
|
||||
function goto_logout() {
|
||||
window.location = "%s";
|
||||
}
|
||||
</script>', $apikey,
|
||||
$login_url, $logout_url);
|
||||
// The below function alters the logout link so that it logs the user out
|
||||
// of Facebook Connect as well as the site. However, for some pages
|
||||
// (FB Connect Settings) we need to output the FB Connect scripts (to
|
||||
// show an existing FB connection even if the user isn't authenticated
|
||||
// with Facebook connect) but NOT alter the logout link. And the only
|
||||
// way to reliably do that is with the FB Connect .js libs. Crazy.
|
||||
|
||||
$action->raw($html);
|
||||
$js .= ' FB.ensureInit(function() {';
|
||||
$js .= ' FB.Connect.ifUserConnected(';
|
||||
$js .= ' function() { ';
|
||||
$js .= ' $(\'#nav_logout a\').attr(\'href\', \'#\');';
|
||||
$js .= ' $(\'#nav_logout a\').click(function() {';
|
||||
$js .= ' FB.Connect.logoutAndRedirect(\'%3$s\');';
|
||||
$js .= ' return false;';
|
||||
$js .= ' })';
|
||||
$js .= ' },';
|
||||
$js .= ' function() {';
|
||||
$js .= ' return false;';
|
||||
$js .= ' }';
|
||||
$js .= ' );';
|
||||
$js .= ' });';
|
||||
$js .= '</script>';
|
||||
|
||||
$js = sprintf($js, $apikey, $login_url, $logout_url);
|
||||
|
||||
// Compress the bugger down a bit
|
||||
$js = str_replace(' ', '', $js);
|
||||
|
||||
$action->raw(" $js"); // leading two spaces to make it line up
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -150,7 +172,6 @@ class FBConnectPlugin extends Plugin
|
|||
|
||||
function onEndShowStatusNetStyles($action)
|
||||
{
|
||||
|
||||
if ($this->reqFbScripts($action)) {
|
||||
$action->cssLink('plugins/FBConnect/FBConnectPlugin.css');
|
||||
}
|
||||
|
@ -269,66 +290,9 @@ class FBConnectPlugin extends Plugin
|
|||
$action->elementEnd('li');
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
$action->menuItem(common_local_url('all', array('nickname' => $user->nickname)),
|
||||
_('Home'), _('Personal profile and friends timeline'), false, 'nav_home');
|
||||
$action->menuItem(common_local_url('profilesettings'),
|
||||
_('Account'), _('Change your email, avatar, password, profile'), false, 'nav_account');
|
||||
$action->menuItem(common_local_url($connect),
|
||||
_('Connect'), _('Connect to services'), false, 'nav_connect');
|
||||
if (common_config('invite', 'enabled')) {
|
||||
$action->menuItem(common_local_url('invite'),
|
||||
_('Invite'),
|
||||
sprintf(_('Invite friends and colleagues to join you on %s'),
|
||||
common_config('site', 'name')),
|
||||
false, 'nav_invitecontact');
|
||||
}
|
||||
|
||||
// Need to override the Logout link to make it do FB stuff
|
||||
if (!empty($fbuid)) {
|
||||
|
||||
$logout_url = common_local_url('logout');
|
||||
$title = _('Logout from the site');
|
||||
$text = _('Logout');
|
||||
|
||||
$html = sprintf('<li id="nav_logout"><a href="#" title="%s" ' .
|
||||
'onclick="FB.Connect.logoutAndRedirect(\'%s\');">%s</a></li>',
|
||||
$title, $logout_url, $text);
|
||||
|
||||
$action->raw($html);
|
||||
|
||||
} else {
|
||||
$action->menuItem(common_local_url('logout'),
|
||||
_('Logout'), _('Logout from the site'), false, 'nav_logout');
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (!common_config('site', 'openidonly')) {
|
||||
if (!common_config('site', 'closed')) {
|
||||
$action->menuItem(common_local_url('register'),
|
||||
_('Register'), _('Create an account'), false, 'nav_register');
|
||||
}
|
||||
$action->menuItem(common_local_url('login'),
|
||||
_('Login'), _('Login to the site'), false, 'nav_login');
|
||||
} else {
|
||||
$this->menuItem(common_local_url('openidlogin'),
|
||||
_('OpenID'), _('Login with OpenID'), false, 'nav_openid');
|
||||
}
|
||||
}
|
||||
|
||||
$action->menuItem(common_local_url('doc', array('title' => 'help')),
|
||||
_('Help'), _('Help me!'), false, 'nav_help');
|
||||
if ($user || !common_config('site', 'private')) {
|
||||
$action->menuItem(common_local_url('peoplesearch'),
|
||||
_('Search'), _('Search for people or text'), false, 'nav_search');
|
||||
}
|
||||
|
||||
// We are replacing the primary nav entirely; give other
|
||||
// plugins a chance to handle it here.
|
||||
|
||||
Event::handle('EndPrimaryNav', array($action));
|
||||
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
function onStartShowLocalNavBlock($action)
|
||||
|
@ -357,7 +321,7 @@ class FBConnectPlugin extends Plugin
|
|||
}
|
||||
|
||||
function onStartLogout($action)
|
||||
{
|
||||
{
|
||||
$action->logout();
|
||||
$fbuid = $this->loggedIn();
|
||||
|
||||
|
|
86
plugins/TwitterBridge/README
Normal file
86
plugins/TwitterBridge/README
Normal file
|
@ -0,0 +1,86 @@
|
|||
This Twitter "bridge" plugin allows you to integrate your StatusNet
|
||||
instance with Twitter. Installing it will allow your users to:
|
||||
|
||||
- automatically post notices to thier Twitter accounts
|
||||
- automatically subscribe to other Twitter users who are also using
|
||||
your StatusNet install, if possible (requires running a daemon)
|
||||
- import their Twitter friends' tweets (requires running a daemon)
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
To enable the plugin, add the following to your config.php:
|
||||
|
||||
require_once(INSTALLDIR . '/plugins/TwitterBridge/TwitterBridgePlugin.php');
|
||||
$tb = new TwitterBridgePlugin();
|
||||
|
||||
OAuth is used to to access protected resources on Twitter (as opposed to
|
||||
HTTP Basic Auth)*. To use Twitter bridging you will need to register
|
||||
your instance of StatusNet as an application on Twitter
|
||||
(http://twitter.com/apps), and update the following variables in your
|
||||
config.php with the consumer key and secret Twitter generates for you:
|
||||
|
||||
$config['twitter']['consumer_key'] = 'YOURKEY';
|
||||
$config['twitter']['consumer_secret'] = 'YOURSECRET';
|
||||
|
||||
When registering your application with Twitter set the type to "Browser"
|
||||
and your Callback URL to:
|
||||
|
||||
http://example.org/mublog/twitter/authorization
|
||||
|
||||
The default access type should be, "Read & Write".
|
||||
|
||||
* Note: The plugin will still push notices to Twitter for users who
|
||||
have previously setup the Twitter bridge using their Twitter name and
|
||||
password under an older versions of StatusNet, but all new Twitter
|
||||
bridge connections will use OAuth.
|
||||
|
||||
Deamons
|
||||
-------
|
||||
|
||||
For friend syncing and importing notices running two additional daemon
|
||||
scripts is necessary (synctwitterfriends.php and
|
||||
twitterstatusfetcher.php).
|
||||
|
||||
In the daemons subidrectory of the plugin are three scripts:
|
||||
|
||||
* Twitter Friends Syncing (daemons/synctwitterfriends.php)
|
||||
|
||||
Users may set a flag in their settings ("Subscribe to my Twitter friends
|
||||
here" under the Twitter tab) to have StatusNet attempt to locate and
|
||||
subscribe to "friends" (people they "follow") on Twitter who also have
|
||||
accounts on your StatusNet system, and who have previously set up a link
|
||||
for automatically posting notices to Twitter.
|
||||
|
||||
The plugin will try to start this daemon when you run
|
||||
scripts/startdaemons.sh.
|
||||
|
||||
* Importing statuses from Twitter (daemons/twitterstatusfetcher.php)
|
||||
|
||||
To allow your users to import their friends' Twitter statuses, you will
|
||||
need to enable the bidirectional Twitter bridge in your config.php:
|
||||
|
||||
$config['twitterimport']['enabled'] = true;
|
||||
|
||||
The plugin will then start the TwitterStatusFetcher daemon along with the
|
||||
other daemons when you run scripts/startdaemons.sh.
|
||||
|
||||
Additionally, you will want to set the integration source variable,
|
||||
which will keep notices posted to Twitter via StatusNet from looping
|
||||
back. The integration source should be set to the name of your
|
||||
application, exactly as you specified it on the settings page for your
|
||||
StatusNet application on Twitter, e.g.:
|
||||
|
||||
$config['integration']['source'] = 'YourApp';
|
||||
|
||||
* TwitterQueueHandler (daemons/twitterqueuehandler.php)
|
||||
|
||||
This script sends queued notices to Twitter for user who have opted to
|
||||
set up Twitter bridging.
|
||||
|
||||
It's not strictly necessary to run this queue handler, and sites that
|
||||
haven't enabled queuing are still able to push notices to Twitter, but
|
||||
for larger sites and sites that wish to improve performance, this
|
||||
script allows notices to be sent "offline" via a separate process.
|
||||
|
||||
The plugin will start this script when you run scripts/startdaemons.sh.
|
187
plugins/TwitterBridge/TwitterBridgePlugin.php
Normal file
187
plugins/TwitterBridge/TwitterBridgePlugin.php
Normal file
|
@ -0,0 +1,187 @@
|
|||
<?php
|
||||
/**
|
||||
* StatusNet, the distributed open-source microblogging tool
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* LICENCE: 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/>.
|
||||
*
|
||||
* @category Plugin
|
||||
* @package StatusNet
|
||||
* @author Zach Copley <zach@status.net>
|
||||
* @copyright 2009 Control Yourself, Inc.
|
||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
||||
* @link http://laconi.ca/
|
||||
*/
|
||||
|
||||
if (!defined('STATUSNET')) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
|
||||
|
||||
/**
|
||||
* Plugin for sending and importing Twitter statuses
|
||||
*
|
||||
* This class allows users to link their Twitter accounts
|
||||
*
|
||||
* @category Plugin
|
||||
* @package StatusNet
|
||||
* @author Zach Copley <zach@status.net>
|
||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
||||
* @link http://laconi.ca/
|
||||
* @link http://twitter.com/
|
||||
*/
|
||||
|
||||
class TwitterBridgePlugin extends Plugin
|
||||
{
|
||||
/**
|
||||
* Initializer for the plugin.
|
||||
*/
|
||||
|
||||
function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add Twitter-related paths to the router table
|
||||
*
|
||||
* Hook for RouterInitialized event.
|
||||
*
|
||||
* @param Net_URL_Mapper &$m path-to-action mapper
|
||||
*
|
||||
* @return boolean hook return
|
||||
*/
|
||||
|
||||
function onRouterInitialized(&$m)
|
||||
{
|
||||
$m->connect('twitter/authorization',
|
||||
array('action' => 'twitterauthorization'));
|
||||
$m->connect('settings/twitter', array('action' => 'twittersettings'));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the Twitter Settings page to the Connect Settings menu
|
||||
*
|
||||
* @param Action &$action The calling page
|
||||
*
|
||||
* @return boolean hook return
|
||||
*/
|
||||
function onEndConnectSettingsNav(&$action)
|
||||
{
|
||||
$action_name = $action->trimmed('action');
|
||||
|
||||
$action->menuItem(common_local_url('twittersettings'),
|
||||
_('Twitter'),
|
||||
_('Twitter integration options'),
|
||||
$action_name === 'twittersettings');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Automatically load the actions and libraries used by the Twitter bridge
|
||||
*
|
||||
* @param Class $cls the class
|
||||
*
|
||||
* @return boolean hook return
|
||||
*
|
||||
*/
|
||||
function onAutoload($cls)
|
||||
{
|
||||
switch ($cls) {
|
||||
case 'TwittersettingsAction':
|
||||
case 'TwitterauthorizationAction':
|
||||
include_once INSTALLDIR . '/plugins/TwitterBridge/' .
|
||||
strtolower(mb_substr($cls, 0, -6)) . '.php';
|
||||
return false;
|
||||
case 'TwitterOAuthClient':
|
||||
include_once INSTALLDIR . '/plugins/TwitterBridge/twitteroauthclient.php';
|
||||
return false;
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a Twitter queue item for each notice
|
||||
*
|
||||
* @param Notice $notice the notice
|
||||
* @param array &$transports the list of transports (queues)
|
||||
*
|
||||
* @return boolean hook return
|
||||
*/
|
||||
function onStartEnqueueNotice($notice, &$transports)
|
||||
{
|
||||
array_push($transports, 'twitter');
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* broadcast the message when not using queuehandler
|
||||
*
|
||||
* @param Notice &$notice the notice
|
||||
* @param array $queue destination queue
|
||||
*
|
||||
* @return boolean hook return
|
||||
*/
|
||||
function onUnqueueHandleNotice(&$notice, $queue)
|
||||
{
|
||||
if (($queue == 'twitter') && ($this->_isLocal($notice))) {
|
||||
broadcast_twitter($notice);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the notice was locally created
|
||||
*
|
||||
* @param Notice $notice
|
||||
*
|
||||
* @return boolean locality
|
||||
*/
|
||||
function _isLocal($notice)
|
||||
{
|
||||
return ($notice->is_local == Notice::LOCAL_PUBLIC ||
|
||||
$notice->is_local == Notice::LOCAL_NONPUBLIC);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add Twitter bridge daemons to the list of daemons to start
|
||||
*
|
||||
* @param array $daemons the list fo daemons to run
|
||||
*
|
||||
* @return boolean hook return
|
||||
*
|
||||
*/
|
||||
function onGetValidDaemons($daemons)
|
||||
{
|
||||
array_push($daemons, INSTALLDIR .
|
||||
'/plugins/TwitterBridge/daemons/twitterqueuehandler.php');
|
||||
array_push($daemons, INSTALLDIR .
|
||||
'/plugins/TwitterBridge/daemons/synctwitterfriends.php');
|
||||
|
||||
if (common_config('twitterimport', 'enabled')) {
|
||||
array_push($daemons, INSTALLDIR
|
||||
. '/plugins/TwitterBridge/daemons/twitterstatusfetcher.php');
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -18,7 +18,7 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
|
||||
define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..'));
|
||||
|
||||
$shortoptions = 'di::';
|
||||
$longoptions = array('id::', 'debug');
|
||||
|
@ -32,6 +32,9 @@ END_OF_TRIM_HELP;
|
|||
|
||||
require_once INSTALLDIR . '/scripts/commandline.inc';
|
||||
require_once INSTALLDIR . '/lib/parallelizingdaemon.php';
|
||||
require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
|
||||
require_once INSTALLDIR . '/plugins/TwitterBridge/twitterbasicauthclient.php';
|
||||
require_once INSTALLDIR . '/plugins/TwitterBridge/twitteroauthclient.php';
|
||||
|
||||
/**
|
||||
* Daemon to sync local friends with Twitter friends
|
||||
|
@ -44,14 +47,6 @@ require_once INSTALLDIR . '/lib/parallelizingdaemon.php';
|
|||
* @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
|
||||
{
|
||||
/**
|
|
@ -18,7 +18,7 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
|
||||
define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..'));
|
||||
|
||||
$shortoptions = 'i::';
|
||||
$longoptions = array('id::');
|
||||
|
@ -30,10 +30,9 @@ Daemon script for pushing new notices to Twitter.
|
|||
|
||||
END_OF_ENJIT_HELP;
|
||||
|
||||
require_once INSTALLDIR.'/scripts/commandline.inc';
|
||||
|
||||
require_once INSTALLDIR . '/lib/twitter.php';
|
||||
require_once INSTALLDIR . '/scripts/commandline.inc';
|
||||
require_once INSTALLDIR . '/lib/queuehandler.php';
|
||||
require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
|
||||
|
||||
class TwitterQueueHandler extends QueueHandler
|
||||
{
|
|
@ -18,7 +18,7 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
|
||||
define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..'));
|
||||
|
||||
// Tune number of processes and how often to poll Twitter
|
||||
// XXX: Should these things be in config.php?
|
||||
|
@ -36,8 +36,12 @@ Batch script for retrieving Twitter messages from foreign service.
|
|||
|
||||
END_OF_TRIM_HELP;
|
||||
|
||||
require_once INSTALLDIR .'/scripts/commandline.inc';
|
||||
require_once INSTALLDIR . '/scripts/commandline.inc';
|
||||
require_once INSTALLDIR . '/lib/common.php';
|
||||
require_once INSTALLDIR . '/lib/daemon.php';
|
||||
require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
|
||||
require_once INSTALLDIR . '/plugins/TwitterBridge/twitterbasicauthclient.php';
|
||||
require_once INSTALLDIR . '/plugins/TwitterBridge/twitteroauthclient.php';
|
||||
|
||||
/**
|
||||
* Fetcher for statuses from Twitter
|
||||
|
@ -496,8 +500,6 @@ class TwitterStatusFetcher extends ParallelizingDaemon
|
|||
$avatar->filename = $filename;
|
||||
$avatar->url = Avatar::url($filename);
|
||||
|
||||
common_debug($this->name() . " - New filename: $avatar->url");
|
||||
|
||||
$avatar->created = common_sql_now();
|
||||
|
||||
$id = $avatar->insert();
|
||||
|
@ -515,9 +517,7 @@ class TwitterStatusFetcher extends ParallelizingDaemon
|
|||
|
||||
function fetchAvatar($url, $filename)
|
||||
{
|
||||
$avatar_dir = INSTALLDIR . '/avatar/';
|
||||
|
||||
$avatarfile = $avatar_dir . $filename;
|
||||
$avatarfile = Avatar::path($filename);
|
||||
|
||||
$out = fopen($avatarfile, 'wb');
|
||||
if (!$out) {
|
|
@ -23,6 +23,9 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
|
|||
|
||||
define('TWITTER_SERVICE', 1); // Twitter is foreign_service ID 1
|
||||
|
||||
require_once INSTALLDIR . '/plugins/TwitterBridge/twitterbasicauthclient.php';
|
||||
require_once INSTALLDIR . '/plugins/TwitterBridge/twitteroauthclient.php';
|
||||
|
||||
function updateTwitter_user($twitter_id, $screen_name)
|
||||
{
|
||||
$uri = 'http://twitter.com/' . $screen_name;
|
|
@ -31,9 +31,32 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
|
|||
exit(1);
|
||||
}
|
||||
|
||||
require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
|
||||
|
||||
/**
|
||||
* Class for doing OAuth authentication against Twitter
|
||||
*
|
||||
* Peforms the OAuth "dance" between StatusNet and Twitter -- requests a token,
|
||||
* authorizes it, and exchanges it for an access token. It also creates a link
|
||||
* (Foreign_link) between the StatusNet user and Twitter user and stores the
|
||||
* access token and secret in the link.
|
||||
*
|
||||
* @category Twitter
|
||||
* @package StatusNet
|
||||
* @author Zach Copley <zach@status.net>
|
||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
||||
* @link http://laconi.ca/
|
||||
*
|
||||
*/
|
||||
class TwitterauthorizationAction extends Action
|
||||
{
|
||||
|
||||
/**
|
||||
* Initialize class members. Looks for 'oauth_token' parameter.
|
||||
*
|
||||
* @param array $args misc. arguments
|
||||
*
|
||||
* @return boolean true
|
||||
*/
|
||||
function prepare($args)
|
||||
{
|
||||
parent::prepare($args);
|
|
@ -31,8 +31,8 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
|
|||
exit(1);
|
||||
}
|
||||
|
||||
require_once INSTALLDIR.'/lib/connectsettingsaction.php';
|
||||
require_once INSTALLDIR.'/lib/twitter.php';
|
||||
require_once INSTALLDIR . '/lib/connectsettingsaction.php';
|
||||
require_once INSTALLDIR . '/plugins/TwitterBridge/twitter.php';
|
||||
|
||||
/**
|
||||
* Settings for Twitter integration
|
||||
|
@ -82,11 +82,6 @@ class TwittersettingsAction extends ConnectSettingsAction
|
|||
|
||||
function showContent()
|
||||
{
|
||||
if (!common_config('twitter', 'enabled')) {
|
||||
$this->element('div', array('class' => 'error'),
|
||||
_('Twitter is not available.'));
|
||||
return;
|
||||
}
|
||||
|
||||
$user = common_current_user();
|
||||
|
||||
|
@ -157,7 +152,7 @@ class TwittersettingsAction extends ConnectSettingsAction
|
|||
false);
|
||||
$this->elementEnd('li');
|
||||
|
||||
if (common_config('twitterbridge','enabled')) {
|
||||
if (common_config('twitterimport','enabled')) {
|
||||
$this->elementStart('li');
|
||||
$this->checkbox('noticerecv',
|
||||
_('Import my Friends Timeline.'),
|
|
@ -49,15 +49,6 @@ if(common_config('xmpp','enabled')) {
|
|||
$daemons[] = INSTALLDIR.'/scripts/xmppconfirmhandler.php';
|
||||
}
|
||||
|
||||
if(common_config('twitterbridge','enabled')) {
|
||||
$daemons[] = INSTALLDIR.'/scripts/twitterstatusfetcher.php';
|
||||
}
|
||||
|
||||
if (common_config('twitter', 'enabled')) {
|
||||
$daemons[] = INSTALLDIR.'/scripts/twitterqueuehandler.php';
|
||||
$daemons[] = INSTALLDIR.'/scripts/synctwitterfriends.php';
|
||||
}
|
||||
|
||||
if (common_config('sms', 'enabled')) {
|
||||
$daemons[] = INSTALLDIR.'/scripts/smsqueuehandler.php';
|
||||
}
|
||||
|
|
|
@ -365,6 +365,10 @@ class MailerDaemon
|
|||
if (preg_match('/^\s*Sent via/', $line)) {
|
||||
continue;
|
||||
}
|
||||
if (preg_match('/^\s*Sent from my/', $line)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// skip everything after a sig
|
||||
if (preg_match('/^\s*--+\s*$/', $line) ||
|
||||
preg_match('/^\s*__+\s*$/', $line))
|
||||
|
|
|
@ -18,7 +18,7 @@ font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
|
|||
font-size:1em;
|
||||
}
|
||||
address {
|
||||
margin-right:7.2%;
|
||||
margin-right:5.8%;
|
||||
}
|
||||
|
||||
input, textarea, select, option {
|
||||
|
|
Loading…
Reference in New Issue
Block a user