forked from GNUsocial/gnu-social
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);
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
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.
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();
|
||||
|
||||
|
|
|
@ -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.
|
|
@ -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