summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/action.php26
-rw-r--r--lib/attachmentlist.php1
-rw-r--r--lib/currentuserdesignaction.php (renamed from lib/personal.php)41
-rw-r--r--lib/galleryaction.php3
-rw-r--r--lib/mail.php1
-rw-r--r--lib/mailbox.php8
-rw-r--r--lib/noticelist.php1
-rw-r--r--lib/omb.php10
-rw-r--r--lib/ownerdesignaction.php72
-rw-r--r--lib/profileaction.php3
-rw-r--r--lib/settingsaction.php2
-rw-r--r--lib/stream.php32
-rw-r--r--lib/twitterapi.php99
-rw-r--r--lib/util.php28
14 files changed, 248 insertions, 79 deletions
diff --git a/lib/action.php b/lib/action.php
index 6a69d2651..55fb7c089 100644
--- a/lib/action.php
+++ b/lib/action.php
@@ -224,6 +224,16 @@ class Action extends HTMLOutputter // lawsuit
'href="'.theme_path('css/ie.css', null).'?version='.LACONICA_VERSION.'" /><![endif]');
Event::handle('EndShowUAStyles', array($this));
}
+ if (Event::handle('StartShowDesign', array($this))) {
+ $design = $this->getDesign();
+ if (!empty($design)) {
+ $cur = common_current_user();
+ if (empty($cur) || $cur->viewdesigns) {
+ $design->showCSS($this);
+ }
+ }
+ Event::handle('EndShowDesign', array($this, $design));
+ }
Event::handle('EndShowStyles', array($this));
}
}
@@ -248,7 +258,6 @@ class Action extends HTMLOutputter // lawsuit
'src' => common_path('js/jquery.joverlay.min.js')),
' ');
-
Event::handle('EndShowJQueryScripts', array($this));
}
if (Event::handle('StartShowLaconicaScripts', array($this))) {
@@ -1095,4 +1104,19 @@ class Action extends HTMLOutputter // lawsuit
'title' => _('Previous')));
}
}
+
+ /**
+ * A design for this action
+ *
+ * A design (colors and background) for the current page. May be
+ * the user's design, or a group's design, or a site design.
+ *
+ * @return Design a design object to use
+ */
+
+ function getDesign()
+ {
+ // XXX: return site design by default
+ return null;
+ }
}
diff --git a/lib/attachmentlist.php b/lib/attachmentlist.php
index 45e4fa319..e1726df28 100644
--- a/lib/attachmentlist.php
+++ b/lib/attachmentlist.php
@@ -46,7 +46,6 @@ if (!defined('LACONICA')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://laconi.ca/
* @see Notice
- * @see StreamAction
* @see NoticeListItem
* @see ProfileNoticeList
*/
diff --git a/lib/personal.php b/lib/currentuserdesignaction.php
index f92732375..297525655 100644
--- a/lib/personal.php
+++ b/lib/currentuserdesignaction.php
@@ -2,7 +2,7 @@
/**
* Laconica, the distributed open-source microblogging tool
*
- * User profile page
+ * Base class for actions that use the current user's design
*
* PHP version 5
*
@@ -19,11 +19,10 @@
* 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 Personal
+ * @category Action
* @package Laconica
* @author Evan Prodromou <evan@controlyourself.ca>
- * @author Sarven Capadisli <csarven@controlyourself.ca>
- * @copyright 2008-2009 Control Yourself, Inc.
+ * @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/
*/
@@ -33,28 +32,38 @@ if (!defined('LACONICA')) {
}
/**
- * Base class for user profile page
+ * Base class for actions that use the current user's design
*
- * @category Personal
+ * Some pages (settings in particular) use the current user's chosen
+ * design. This superclass returns that design.
+ *
+ * @category Action
* @package Laconica
* @author Evan Prodromou <evan@controlyourself.ca>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://laconi.ca/
+ *
*/
-class PersonalAction extends Action
+class CurrentUserDesignAction extends Action
{
+ /**
+ * A design for this action
+ *
+ * if the user attribute has been set, returns that user's
+ * design.
+ *
+ * @return Design a design object to use
+ */
- var $user = null;
-
- function isReadOnly($args)
+ function getDesign()
{
- return true;
- }
+ $cur = common_current_user();
- function handle($args)
- {
- parent::handle($args);
- }
+ if (empty($cur)) {
+ return null;
+ }
+ return $cur->getDesign();
+ }
}
diff --git a/lib/galleryaction.php b/lib/galleryaction.php
index 8fa11a756..498c82851 100644
--- a/lib/galleryaction.php
+++ b/lib/galleryaction.php
@@ -27,10 +27,9 @@ require_once INSTALLDIR.'/lib/profilelist.php';
define('AVATARS_PER_PAGE', 80);
-class GalleryAction extends Action
+class GalleryAction extends OwnerDesignAction
{
var $profile = null;
- var $user = null;
var $page = null;
var $tag = null;
diff --git a/lib/mail.php b/lib/mail.php
index 27a1d99dc..4e1f1dbb1 100644
--- a/lib/mail.php
+++ b/lib/mail.php
@@ -335,6 +335,7 @@ function mail_broadcast_notice_sms($notice)
"FROM $UT JOIN subscription " .
"ON $UT.id = subscription.subscriber " .
'WHERE subscription.subscribed = ' . $notice->profile_id . ' ' .
+ 'AND subscription.subscribed != subscription.subscriber ' .
"AND $UT.smsemail IS NOT null " .
"AND $UT.smsnotify = 1 " .
'AND subscription.sms = 1 ');
diff --git a/lib/mailbox.php b/lib/mailbox.php
index 01bbf5721..766510a47 100644
--- a/lib/mailbox.php
+++ b/lib/mailbox.php
@@ -47,11 +47,11 @@ define('MESSAGES_PER_PAGE', 20);
* @see OutboxAction
*/
-class MailboxAction extends PersonalAction
+class MailboxAction extends CurrentUserDesignAction
{
var $page = null;
- function prepare($args)
+ function prepare($args)
{
parent::prepare($args);
@@ -265,12 +265,12 @@ class MailboxAction extends PersonalAction
* Returns either the name (and link) of the API client that posted the notice,
* or one of other other channels.
*
- * @param string $source the source of the message
+ * @param string $source the source of the message
*
* @return void
*/
- function showSource($source)
+ function showSource($source)
{
$source_name = _($source);
switch ($source) {
diff --git a/lib/noticelist.php b/lib/noticelist.php
index 9ace341d8..c00942af4 100644
--- a/lib/noticelist.php
+++ b/lib/noticelist.php
@@ -50,7 +50,6 @@ require_once INSTALLDIR.'/lib/attachmentlist.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://laconi.ca/
* @see Notice
- * @see StreamAction
* @see NoticeListItem
* @see ProfileNoticeList
*/
diff --git a/lib/omb.php b/lib/omb.php
index e8e1acc41..40cb847df 100644
--- a/lib/omb.php
+++ b/lib/omb.php
@@ -159,13 +159,9 @@ function omb_post_notice($notice, $remote_profile, $subscription)
function omb_post_notice_keys($notice, $postnoticeurl, $tk, $secret)
{
-
- common_debug('Posting notice ' . $notice->id . ' to ' . $postnoticeurl, __FILE__);
-
$user = User::staticGet('id', $notice->profile_id);
if (!$user) {
- common_debug('Failed to get user for notice ' . $notice->id . ', profile = ' . $notice->profile_id, __FILE__);
return false;
}
@@ -208,8 +204,6 @@ function omb_post_notice_keys($notice, $postnoticeurl, $tk, $secret)
$req->to_postdata(),
array('User-Agent: Laconica/' . LACONICA_VERSION));
- common_debug('Got HTTP result "'.print_r($result,true).'"', __FILE__);
-
if ($result->status == 403) { # not authorized, don't send again
common_debug('403 result, deleting subscription', __FILE__);
# FIXME: figure out how to delete this
@@ -286,14 +280,10 @@ function omb_update_profile($profile, $remote_profile, $subscription)
$fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
- common_debug('request URL = '.$req->get_normalized_http_url(), __FILE__);
- common_debug('postdata = '.$req->to_postdata(), __FILE__);
$result = $fetcher->post($req->get_normalized_http_url(),
$req->to_postdata(),
array('User-Agent: Laconica/' . LACONICA_VERSION));
- common_debug('Got HTTP result "'.print_r($result,true).'"', __FILE__);
-
if (empty($result) || !$result) {
common_debug("Unable to contact " . $req->get_normalized_http_url());
} else if ($result->status == 403) { # not authorized, don't send again
diff --git a/lib/ownerdesignaction.php b/lib/ownerdesignaction.php
new file mode 100644
index 000000000..c47633bdb
--- /dev/null
+++ b/lib/ownerdesignaction.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Laconica, the distributed open-source microblogging tool
+ *
+ * Base class for actions that use the page owner's design
+ *
+ * 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 Action
+ * @package Laconica
+ * @author Evan Prodromou <evan@controlyourself.ca>
+ * @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('LACONICA')) {
+ exit(1);
+}
+
+/**
+ * Base class for actions that use the page owner's design
+ *
+ * Some pages have a clear "owner" -- like the profile page, subscriptions
+ * pages, etc. This superclass uses that owner's chosen design for the page
+ * design.
+ *
+ * @category Action
+ * @package Laconica
+ * @author Evan Prodromou <evan@controlyourself.ca>
+ * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
+ * @link http://laconi.ca/
+ *
+ */
+
+class OwnerDesignAction extends Action {
+
+ /** The user for this page. */
+
+ var $user = null;
+
+ /**
+ * A design for this action
+ *
+ * if the user attribute has been set, returns that user's
+ * design.
+ *
+ * @return Design a design object to use
+ */
+
+ function getDesign()
+ {
+ if (empty($this->user)) {
+ return null;
+ }
+
+ return $this->user->getDesign();
+ }
+}
diff --git a/lib/profileaction.php b/lib/profileaction.php
index a3437ff4d..a14d3846e 100644
--- a/lib/profileaction.php
+++ b/lib/profileaction.php
@@ -47,9 +47,8 @@ require_once INSTALLDIR.'/lib/groupminilist.php';
* @link http://laconi.ca/
*/
-class ProfileAction extends Action
+class ProfileAction extends OwnerDesignAction
{
- var $user = null;
var $page = null;
var $profile = null;
var $tag = null;
diff --git a/lib/settingsaction.php b/lib/settingsaction.php
index db20c5804..17d3a2f64 100644
--- a/lib/settingsaction.php
+++ b/lib/settingsaction.php
@@ -43,7 +43,7 @@ if (!defined('LACONICA')) {
* @see Widget
*/
-class SettingsAction extends Action
+class SettingsAction extends CurrentUserDesignAction
{
/**
* A message for the user.
diff --git a/lib/stream.php b/lib/stream.php
deleted file mode 100644
index 0cb9e0bf4..000000000
--- a/lib/stream.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-/*
- * Laconica - a distributed open-source microblogging tool
- * Copyright (C) 2008, Controlez-Vous, Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-if (!defined('LACONICA')) { exit(1); }
-
-require_once(INSTALLDIR.'/lib/personal.php');
-require_once(INSTALLDIR.'/lib/noticelist.php');
-
-class StreamAction extends PersonalAction
-{
- function show_notice_list($notice)
- {
- $nl = new NoticeList($notice);
- return $nl->show();
- }
-}
diff --git a/lib/twitterapi.php b/lib/twitterapi.php
index caf8c0716..ca8b03cdc 100644
--- a/lib/twitterapi.php
+++ b/lib/twitterapi.php
@@ -54,7 +54,7 @@ class TwitterapiAction extends Action
/**
* Overrides XMLOutputter::element to write booleans as strings (true|false).
* See that method's documentation for more info.
- *
+ *
* @param string $tag Element type or tagname
* @param array $attrs Array of element attributes, as
* key-value pairs
@@ -70,24 +70,85 @@ class TwitterapiAction extends Action
return parent::element($tag, $attrs, $content);
}
-
+
function twitter_user_array($profile, $get_notice=false)
{
-
$twitter_user = array();
+ $twitter_user['id'] = intval($profile->id);
$twitter_user['name'] = $profile->getBestName();
- $twitter_user['followers_count'] = $this->count_subscriptions($profile);
$twitter_user['screen_name'] = $profile->nickname;
- $twitter_user['description'] = ($profile->bio) ? $profile->bio : null;
$twitter_user['location'] = ($profile->location) ? $profile->location : null;
- $twitter_user['id'] = intval($profile->id);
+ $twitter_user['description'] = ($profile->bio) ? $profile->bio : null;
$avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
+ $twitter_user['profile_image_url'] = ($avatar) ? $avatar->displayUrl() :
+ Avatar::defaultImage(AVATAR_STREAM_SIZE);
- $twitter_user['profile_image_url'] = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE);
- $twitter_user['protected'] = false; # not supported by Laconica yet
$twitter_user['url'] = ($profile->homepage) ? $profile->homepage : null;
+ $twitter_user['protected'] = false; # not supported by Laconica yet
+ $twitter_user['followers_count'] = $this->count_subscriptions($profile);
+
+ // To be supported soon...
+ $twitter_user['profile_background_color'] = '';
+ $twitter_user['profile_text_color'] = '';
+ $twitter_user['profile_link_color'] = '';
+ $twitter_user['profile_sidebar_fill_color'] = '';
+ $twitter_user['profile_sidebar_border_color'] = '';
+
+ $subbed = DB_DataObject::factory('subscription');
+ $subbed->subscriber = $profile->id;
+ $subbed_count = (int) $subbed->count() - 1;
+ $twitter_user['friends_count'] = (is_int($subbed_count)) ? $subbed_count : 0;
+
+ $twitter_user['created_at'] = $this->date_twitter($profile->created);
+
+ $faves = DB_DataObject::factory('fave');
+ $faves->user_id = $user->id;
+ $faves_count = (int) $faves->count();
+ $twitter_user['favourites_count'] = $faves_count; // British spelling!
+
+ // Need to pull up the user for some of this
+ $user = User::staticGet($profile->id);
+
+ $timezone = 'UTC';
+
+ if ($user->timezone) {
+ $timezone = $user->timezone;
+ }
+
+ $t = new DateTime;
+ $t->setTimezone(new DateTimeZone($timezone));
+
+ $twitter_user['utc_offset'] = $t->format('Z');
+ $twitter_user['time_zone'] = $timezone;
+
+ // To be supported some day, perhaps
+ $twitter_user['profile_background_image_url'] = '';
+ $twitter_user['profile_background_tile'] = false;
+
+ $notices = DB_DataObject::factory('notice');
+ $notices->profile_id = $profile->id;
+ $notice_count = (int) $notices->count();
+
+ $twitter_user['statuses_count'] = (is_int($notice_count)) ? $notice_count : 0;
+
+ // Is the requesting user following this user?
+ $twitter_user['following'] = false;
+ $twitter_user['notifications'] = false;
+
+ if (isset($apidata['user'])) {
+
+ $twitter_user['following'] = $apidata['user']->isSubscribed($profile);
+
+ // Notifications on?
+ $sub = Subscription::pkeyGet(array('subscriber' =>
+ $apidata['user']->id, 'subscribed' => $profile->id));
+
+ if ($sub) {
+ $twitter_user['notifications'] = ($sub->jabber || $sub->sms);
+ }
+ }
if ($get_notice) {
$notice = $profile->getCurrentNotice();
@@ -612,7 +673,27 @@ class TwitterapiAction extends Action
function get_user($id, $apidata=null)
{
if (!$id) {
- return $apidata['user'];
+
+ // Twitter supports these other ways of passing the user ID
+ if (is_numeric($this->arg('id'))) {
+ return User::staticGet($this->arg('id'));
+ } else if ($this->arg('id')) {
+ $nickname = common_canonical_nickname($this->arg('id'));
+ return User::staticGet('nickname', $nickname);
+ } else if ($this->arg('user_id')) {
+ // This is to ensure that a non-numeric user_id still
+ // overrides screen_name even if it doesn't get used
+ if (is_numeric($this->arg('user_id'))) {
+ return User::staticGet('id', $this->arg('user_id'));
+ }
+ } else if ($this->arg('screen_name')) {
+ $nickname = common_canonical_nickname($this->arg('screen_name'));
+ return User::staticGet('nickname', $nickname);
+ } else {
+ // Fall back to trying the currently authenticated user
+ return $apidata['user'];
+ }
+
} else if (is_numeric($id)) {
return User::staticGet($id);
} else {
diff --git a/lib/util.php b/lib/util.php
index ab1272309..9872d97c4 100644
--- a/lib/util.php
+++ b/lib/util.php
@@ -900,6 +900,34 @@ function common_enqueue_notice($notice)
return $result;
}
+function common_post_inbox_transports()
+{
+ $transports = array('omb', 'sms');
+
+ if (common_config('xmpp', 'enabled')) {
+ $transports = array_merge($transports, array('jabber', 'public'));
+ }
+
+ return $transports;
+}
+
+function common_enqueue_notice_transport($notice, $transport)
+{
+ $qi = new Queue_item();
+ $qi->notice_id = $notice->id;
+ $qi->transport = $transport;
+ $qi->created = $notice->created;
+ $result = $qi->insert();
+ if (!$result) {
+ $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
+ common_log(LOG_ERR, 'DB error inserting queue item: ' . $last_error->message);
+ throw new ServerException('DB error inserting queue item: ' . $last_error->message);
+>>>>>>> 0.7.x:lib/util.php
+ }
+ common_log(LOG_DEBUG, 'complete queueing notice ID = ' . $notice->id . ' for ' . $transport);
+ return true;
+}
+
function common_real_broadcast($notice, $remote=false)
{
$success = true;