2008-05-07 18:15:42 +01:00
|
|
|
<?php
|
2008-05-20 20:14:12 +01:00
|
|
|
/*
|
2008-05-14 20:26:48 +01:00
|
|
|
* Laconica - a distributed open-source microblogging tool
|
|
|
|
* Copyright (C) 2008, Controlez-Vous, Inc.
|
2008-05-20 20:14:12 +01:00
|
|
|
*
|
2008-05-14 20:26:48 +01:00
|
|
|
* 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.
|
2008-05-20 20:14:12 +01:00
|
|
|
*
|
2008-05-14 20:26:48 +01:00
|
|
|
* 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.
|
2008-05-20 20:14:12 +01:00
|
|
|
*
|
2008-05-14 20:26:48 +01:00
|
|
|
* 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/>.
|
|
|
|
*/
|
|
|
|
|
2008-05-17 16:47:01 +01:00
|
|
|
if (!defined('LACONICA')) { exit(1); }
|
2008-09-15 07:56:16 +01:00
|
|
|
|
2008-05-07 18:15:42 +01:00
|
|
|
/**
|
|
|
|
* Table Definition for user
|
|
|
|
*/
|
2008-09-26 17:18:24 +01:00
|
|
|
require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
|
2008-05-20 19:57:56 +01:00
|
|
|
require_once 'Validate.php';
|
2008-05-07 18:15:42 +01:00
|
|
|
|
2008-12-08 03:10:08 +00:00
|
|
|
class User extends Memcached_DataObject
|
2008-05-07 18:15:42 +01:00
|
|
|
{
|
|
|
|
###START_AUTOCODE
|
|
|
|
/* the code below is auto generated do not remove the above tag */
|
|
|
|
|
|
|
|
public $__table = 'user'; // table name
|
|
|
|
public $id; // int(4) primary_key not_null
|
2008-05-15 17:28:44 +01:00
|
|
|
public $nickname; // varchar(64) unique_key
|
2008-12-08 03:10:08 +00:00
|
|
|
public $password; // varchar(255)
|
2008-05-07 18:15:42 +01:00
|
|
|
public $email; // varchar(255) unique_key
|
2008-07-17 14:25:33 +01:00
|
|
|
public $incomingemail; // varchar(255) unique_key
|
2008-07-15 23:20:26 +01:00
|
|
|
public $emailnotifysub; // tinyint(1) default_1
|
2008-09-08 19:16:24 +01:00
|
|
|
public $emailnotifyfav; // tinyint(1) default_1
|
2008-11-20 20:54:21 +00:00
|
|
|
public $emailnotifynudge; // tinyint(1) default_1
|
2008-09-17 18:47:41 +01:00
|
|
|
public $emailnotifymsg; // tinyint(1) default_1
|
2008-07-21 14:56:37 +01:00
|
|
|
public $emailmicroid; // tinyint(1) default_1
|
2008-12-08 03:10:08 +00:00
|
|
|
public $language; // varchar(50)
|
|
|
|
public $timezone; // varchar(50)
|
2008-07-21 14:56:37 +01:00
|
|
|
public $emailpost; // tinyint(1) default_1
|
2008-06-22 16:50:28 +01:00
|
|
|
public $jabber; // varchar(255) unique_key
|
2008-12-08 03:10:08 +00:00
|
|
|
public $jabbernotify; // tinyint(1)
|
|
|
|
public $jabberreplies; // tinyint(1)
|
2008-07-21 13:00:36 +01:00
|
|
|
public $jabbermicroid; // tinyint(1) default_1
|
2008-12-08 03:10:08 +00:00
|
|
|
public $updatefrompresence; // tinyint(1)
|
2008-06-22 16:50:28 +01:00
|
|
|
public $sms; // varchar(64) unique_key
|
2008-12-08 03:10:08 +00:00
|
|
|
public $carrier; // int(4)
|
|
|
|
public $smsnotify; // tinyint(1)
|
|
|
|
public $smsreplies; // tinyint(1)
|
|
|
|
public $smsemail; // varchar(255)
|
2008-05-22 19:41:09 +01:00
|
|
|
public $uri; // varchar(255) unique_key
|
2008-12-08 03:10:08 +00:00
|
|
|
public $autosubscribe; // tinyint(1)
|
2008-11-20 20:54:21 +00:00
|
|
|
public $urlshorteningservice; // varchar(50) default_ur1.ca
|
2008-12-08 03:10:08 +00:00
|
|
|
public $inboxed; // tinyint(1)
|
2008-05-07 18:15:42 +01:00
|
|
|
public $created; // datetime() not_null
|
|
|
|
public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP
|
|
|
|
|
|
|
|
/* Static get */
|
2008-09-26 17:09:41 +01:00
|
|
|
function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('User',$k,$v); }
|
2008-05-07 18:15:42 +01:00
|
|
|
|
|
|
|
/* the code above is auto generated do not remove the tag below */
|
|
|
|
###END_AUTOCODE
|
2008-05-20 20:14:12 +01:00
|
|
|
|
2008-05-14 15:54:36 +01:00
|
|
|
function getProfile() {
|
2008-10-02 17:25:13 +01:00
|
|
|
return Profile::staticGet('id', $this->id);
|
2008-05-14 15:54:36 +01:00
|
|
|
}
|
2008-05-20 20:14:12 +01:00
|
|
|
|
2008-05-14 15:54:36 +01:00
|
|
|
function isSubscribed($other) {
|
|
|
|
assert(!is_null($other));
|
2008-10-02 17:25:13 +01:00
|
|
|
# XXX: cache results of this query
|
|
|
|
$sub = Subscription::pkeyGet(array('subscriber' => $this->id,
|
|
|
|
'subscribed' => $other->id));
|
|
|
|
return (is_null($sub)) ? false : true;
|
2008-05-14 15:54:36 +01:00
|
|
|
}
|
2008-06-22 15:56:44 +01:00
|
|
|
|
|
|
|
# 'update' won't write key columns, so we have to do it ourselves.
|
2008-07-09 23:46:30 +01:00
|
|
|
|
2008-06-22 15:56:44 +01:00
|
|
|
function updateKeys(&$orig) {
|
|
|
|
$parts = array();
|
2008-07-21 14:56:37 +01:00
|
|
|
foreach (array('nickname', 'email', 'jabber', 'incomingemail', 'sms', 'carrier', 'smsemail', 'language', 'timezone') as $k) {
|
2008-06-22 16:32:20 +01:00
|
|
|
if (strcmp($this->$k, $orig->$k) != 0) {
|
2008-06-22 16:16:11 +01:00
|
|
|
$parts[] = $k . ' = ' . $this->_quote($this->$k);
|
2008-06-22 15:56:44 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (count($parts) == 0) {
|
|
|
|
# No changes
|
2008-06-22 16:16:11 +01:00
|
|
|
return true;
|
2008-06-22 15:56:44 +01:00
|
|
|
}
|
|
|
|
$toupdate = implode(', ', $parts);
|
2008-09-15 08:02:56 +01:00
|
|
|
|
|
|
|
$table = $this->tableName();
|
|
|
|
if(common_config('db','quote_identifiers')) {
|
|
|
|
$table = '"' . $table . '"';
|
|
|
|
}
|
|
|
|
$qry = 'UPDATE ' . $table . ' SET ' . $toupdate .
|
2008-06-22 15:56:44 +01:00
|
|
|
' WHERE id = ' . $this->id;
|
2008-09-26 17:09:41 +01:00
|
|
|
$orig->decache();
|
|
|
|
$result = $this->query($qry);
|
|
|
|
if ($result) {
|
|
|
|
$this->encache();
|
|
|
|
}
|
|
|
|
return $result;
|
2008-06-22 15:56:44 +01:00
|
|
|
}
|
2008-07-09 23:46:30 +01:00
|
|
|
|
2008-06-22 19:04:37 +01:00
|
|
|
function allowed_nickname($nickname) {
|
|
|
|
# XXX: should already be validated for size, content, etc.
|
|
|
|
static $blacklist = array('rss', 'xrds', 'doc', 'main',
|
2008-07-09 23:31:44 +01:00
|
|
|
'settings', 'notice', 'user',
|
2008-09-09 01:06:50 +01:00
|
|
|
'search', 'avatar', 'tag', 'tags',
|
2008-09-17 19:02:44 +01:00
|
|
|
'api', 'message');
|
2008-06-22 19:04:37 +01:00
|
|
|
$merged = array_merge($blacklist, common_config('nickname', 'blacklist'));
|
|
|
|
return !in_array($nickname, $merged);
|
|
|
|
}
|
2008-06-23 04:08:37 +01:00
|
|
|
|
2008-07-07 06:43:58 +01:00
|
|
|
function getCurrentNotice($dt=NULL) {
|
|
|
|
$profile = $this->getProfile();
|
2008-07-07 07:23:47 +01:00
|
|
|
if (!$profile) {
|
|
|
|
return NULL;
|
|
|
|
}
|
2008-07-07 06:43:58 +01:00
|
|
|
return $profile->getCurrentNotice($dt);
|
|
|
|
}
|
2008-08-27 01:19:27 +01:00
|
|
|
|
2008-07-20 20:30:05 +01:00
|
|
|
function getCarrier() {
|
2008-10-02 17:25:13 +01:00
|
|
|
return Sms_carrier::staticGet('id', $this->carrier);
|
2008-07-20 20:30:05 +01:00
|
|
|
}
|
2008-08-27 01:19:27 +01:00
|
|
|
|
2008-07-20 21:16:20 +01:00
|
|
|
function subscribeTo($other) {
|
|
|
|
$sub = new Subscription();
|
|
|
|
$sub->subscriber = $this->id;
|
|
|
|
$sub->subscribed = $other->id;
|
|
|
|
|
2008-08-27 01:19:27 +01:00
|
|
|
$sub->created = common_sql_now(); # current time
|
2008-07-20 21:16:20 +01:00
|
|
|
|
|
|
|
if (!$sub->insert()) {
|
|
|
|
return false;
|
|
|
|
}
|
2008-08-27 01:19:27 +01:00
|
|
|
|
2008-07-21 00:33:08 +01:00
|
|
|
return true;
|
2008-07-20 21:16:20 +01:00
|
|
|
}
|
2008-07-22 17:15:49 +01:00
|
|
|
|
2008-12-08 03:10:08 +00:00
|
|
|
function hasBlocked($other) {
|
2008-12-09 04:12:27 +00:00
|
|
|
|
2008-12-09 04:16:48 +00:00
|
|
|
$block = Profile_block::get($this->id, $other->id);
|
2008-12-08 03:10:08 +00:00
|
|
|
|
|
|
|
if (is_null($block)) {
|
|
|
|
$result = false;
|
|
|
|
} else {
|
|
|
|
$result = true;
|
|
|
|
$block->free();
|
|
|
|
}
|
|
|
|
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
2008-08-14 01:20:38 +01:00
|
|
|
static function register($fields) {
|
|
|
|
|
2008-08-25 19:41:04 +01:00
|
|
|
# MAGICALLY put fields into current scope
|
2008-08-27 01:19:27 +01:00
|
|
|
|
2008-08-14 01:20:38 +01:00
|
|
|
extract($fields);
|
2008-08-27 01:19:27 +01:00
|
|
|
|
2008-08-14 01:20:38 +01:00
|
|
|
$profile = new Profile();
|
|
|
|
|
|
|
|
$profile->query('BEGIN');
|
|
|
|
|
|
|
|
$profile->nickname = $nickname;
|
|
|
|
$profile->profileurl = common_profile_url($nickname);
|
2008-08-27 01:19:27 +01:00
|
|
|
|
2008-08-14 01:20:38 +01:00
|
|
|
if ($fullname) {
|
|
|
|
$profile->fullname = $fullname;
|
|
|
|
}
|
|
|
|
if ($homepage) {
|
|
|
|
$profile->homepage = $homepage;
|
|
|
|
}
|
|
|
|
if ($bio) {
|
|
|
|
$profile->bio = $bio;
|
|
|
|
}
|
|
|
|
if ($location) {
|
|
|
|
$profile->location = $location;
|
|
|
|
}
|
2008-08-27 01:19:27 +01:00
|
|
|
|
2008-08-25 19:41:04 +01:00
|
|
|
$profile->created = common_sql_now();
|
2008-08-27 01:19:27 +01:00
|
|
|
|
2008-08-14 01:20:38 +01:00
|
|
|
$id = $profile->insert();
|
|
|
|
|
|
|
|
if (!$id) {
|
|
|
|
common_log_db_error($profile, 'INSERT', __FILE__);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2008-08-27 01:19:27 +01:00
|
|
|
|
2008-08-14 01:20:38 +01:00
|
|
|
$user = new User();
|
2008-08-27 01:19:27 +01:00
|
|
|
|
2008-08-14 01:20:38 +01:00
|
|
|
$user->id = $id;
|
|
|
|
$user->nickname = $nickname;
|
2008-08-25 19:41:04 +01:00
|
|
|
|
|
|
|
if ($password) { # may not have a password for OpenID users
|
|
|
|
$user->password = common_munge_password($password, $id);
|
|
|
|
}
|
2008-08-27 01:19:27 +01:00
|
|
|
|
|
|
|
# Users who respond to invite email have proven their ownership of that address
|
|
|
|
|
|
|
|
if ($code) {
|
2008-08-27 02:05:15 +01:00
|
|
|
$invite = Invitation::staticGet($code);
|
|
|
|
if ($invite && $invite->address && $invite->address_type == 'email' && $invite->address == $email) {
|
2008-08-27 01:19:27 +01:00
|
|
|
$user->email = $invite->address;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-11-16 06:29:37 +00:00
|
|
|
$inboxes = common_config('inboxes', 'enabled');
|
2008-12-08 03:10:08 +00:00
|
|
|
|
2008-11-16 06:29:37 +00:00
|
|
|
if ($inboxes === true || $inboxes == 'transitional') {
|
|
|
|
$user->inboxed = 1;
|
|
|
|
}
|
2008-12-08 03:10:08 +00:00
|
|
|
|
2008-08-25 19:41:04 +01:00
|
|
|
$user->created = common_sql_now();
|
2008-08-14 01:20:38 +01:00
|
|
|
$user->uri = common_user_uri($user);
|
|
|
|
|
|
|
|
$result = $user->insert();
|
|
|
|
|
|
|
|
if (!$result) {
|
|
|
|
common_log_db_error($user, 'INSERT', __FILE__);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
# Everyone is subscribed to themself
|
|
|
|
|
|
|
|
$subscription = new Subscription();
|
|
|
|
$subscription->subscriber = $user->id;
|
|
|
|
$subscription->subscribed = $user->id;
|
|
|
|
$subscription->created = $user->created;
|
2008-08-27 01:19:27 +01:00
|
|
|
|
2008-08-14 01:20:38 +01:00
|
|
|
$result = $subscription->insert();
|
2008-08-27 01:19:27 +01:00
|
|
|
|
2008-08-14 01:20:38 +01:00
|
|
|
if (!$result) {
|
|
|
|
common_log_db_error($subscription, 'INSERT', __FILE__);
|
|
|
|
return FALSE;
|
|
|
|
}
|
2008-08-27 01:19:27 +01:00
|
|
|
|
2008-08-27 02:05:15 +01:00
|
|
|
if ($email && !$user->email) {
|
2008-08-14 01:20:38 +01:00
|
|
|
|
|
|
|
$confirm = new Confirm_address();
|
|
|
|
$confirm->code = common_confirmation_code(128);
|
|
|
|
$confirm->user_id = $user->id;
|
|
|
|
$confirm->address = $email;
|
|
|
|
$confirm->address_type = 'email';
|
|
|
|
|
|
|
|
$result = $confirm->insert();
|
|
|
|
if (!$result) {
|
|
|
|
common_log_db_error($confirm, 'INSERT', __FILE__);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-08-27 01:19:27 +01:00
|
|
|
if ($code && $user->email) {
|
|
|
|
$user->emailChanged();
|
|
|
|
}
|
|
|
|
|
2008-08-14 01:20:38 +01:00
|
|
|
$profile->query('COMMIT');
|
|
|
|
|
2008-08-27 02:05:15 +01:00
|
|
|
if ($email && !$user->email) {
|
2008-08-14 01:20:38 +01:00
|
|
|
mail_confirm_address($confirm->code,
|
|
|
|
$profile->nickname,
|
|
|
|
$email);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $user;
|
|
|
|
}
|
2008-08-27 01:19:27 +01:00
|
|
|
|
|
|
|
# Things we do when the email changes
|
|
|
|
|
|
|
|
function emailChanged() {
|
|
|
|
|
|
|
|
$invites = new Invitation();
|
2008-09-23 19:16:48 +01:00
|
|
|
$invites->address = $this->email;
|
2008-08-27 01:19:27 +01:00
|
|
|
$invites->address_type = 'email';
|
|
|
|
|
|
|
|
if ($invites->find()) {
|
|
|
|
while ($invites->fetch()) {
|
|
|
|
$other = User::staticGet($invites->user_id);
|
|
|
|
subs_subscribe_to($other, $this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2008-09-08 19:16:24 +01:00
|
|
|
|
|
|
|
function hasFave($notice) {
|
2008-11-22 16:33:47 +00:00
|
|
|
$cache = common_memcache();
|
|
|
|
|
|
|
|
# XXX: Kind of a hack.
|
2008-12-08 03:10:08 +00:00
|
|
|
|
2008-11-22 16:33:47 +00:00
|
|
|
if ($cache) {
|
|
|
|
# This is the stream of favorite notices, in rev chron
|
|
|
|
# order. This forces it into cache.
|
|
|
|
$faves = $this->favoriteNotices(0, NOTICE_CACHE_WINDOW);
|
2008-11-22 19:28:57 +00:00
|
|
|
$cnt = 0;
|
2008-12-08 03:10:08 +00:00
|
|
|
|
2008-11-22 16:33:47 +00:00
|
|
|
while ($faves->fetch()) {
|
2008-11-22 16:35:52 +00:00
|
|
|
if ($faves->id < $notice->id) {
|
2008-11-22 16:33:47 +00:00
|
|
|
# If we passed it, it's not a fave
|
|
|
|
return false;
|
|
|
|
} else if ($faves->id == $notice->id) {
|
|
|
|
# If it matches a cached notice, then it's a fave
|
|
|
|
return true;
|
|
|
|
}
|
2008-11-22 19:28:57 +00:00
|
|
|
$cnt++;
|
2008-11-22 16:33:47 +00:00
|
|
|
}
|
2008-11-22 19:28:57 +00:00
|
|
|
# If we're not past the end of the cache window,
|
|
|
|
# then the cache has all available faves, so this one
|
|
|
|
# is not a fave.
|
|
|
|
if ($cnt < NOTICE_CACHE_WINDOW) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
# Otherwise, cache doesn't have all faves;
|
2008-11-22 16:33:47 +00:00
|
|
|
# fall through to the default
|
|
|
|
}
|
2008-12-08 03:10:08 +00:00
|
|
|
|
2008-10-02 17:25:13 +01:00
|
|
|
$fave = Fave::pkeyGet(array('user_id' => $this->id,
|
|
|
|
'notice_id' => $notice->id));
|
2008-10-02 17:27:39 +01:00
|
|
|
return ((is_null($fave)) ? false : true);
|
2008-09-08 19:16:24 +01:00
|
|
|
}
|
2008-12-08 03:10:08 +00:00
|
|
|
|
2008-09-17 18:47:41 +01:00
|
|
|
function mutuallySubscribed($other) {
|
|
|
|
return $this->isSubscribed($other) &&
|
|
|
|
$other->isSubscribed($this);
|
|
|
|
}
|
2008-12-08 03:10:08 +00:00
|
|
|
|
2008-09-17 18:47:41 +01:00
|
|
|
function mutuallySubscribedUsers() {
|
|
|
|
|
|
|
|
# 3-way join; probably should get cached
|
2008-12-08 03:10:08 +00:00
|
|
|
|
2008-09-17 18:47:41 +01:00
|
|
|
$qry = 'SELECT user.* ' .
|
|
|
|
'FROM subscription sub1 JOIN user ON sub1.subscribed = user.id ' .
|
|
|
|
'JOIN subscription sub2 ON user.id = sub2.subscriber ' .
|
|
|
|
'WHERE sub1.subscriber = %d and sub2.subscribed = %d ' .
|
|
|
|
'ORDER BY user.nickname';
|
2008-12-08 03:10:08 +00:00
|
|
|
|
2008-09-17 18:47:41 +01:00
|
|
|
$user = new User();
|
|
|
|
$user->query(sprintf($qry, $this->id, $this->id));
|
|
|
|
|
|
|
|
return $user;
|
|
|
|
}
|
single function for important streams, with memcached support
I moved the 4 streams for a user (with friends, faves, replies,
personal) into functions on the User object. Added a helper function
in Notice for making notice streams. Also, will fetch notice streams
out of the memcached server, if possible. Made the API, RSS, and HTML
output all use the same streams (hopefully cached).
Added some code to Notice to blow the cache when a notice is posted.
Also, added code to favor and disfavor actions to blow the faves
cache, too.
darcs-hash:20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz
2008-09-28 13:01:19 +01:00
|
|
|
|
2008-12-09 05:53:45 +00:00
|
|
|
function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) {
|
single function for important streams, with memcached support
I moved the 4 streams for a user (with friends, faves, replies,
personal) into functions on the User object. Added a helper function
in Notice for making notice streams. Also, will fetch notice streams
out of the memcached server, if possible. Made the API, RSS, and HTML
output all use the same streams (hopefully cached).
Added some code to Notice to blow the cache when a notice is posted.
Also, added code to favor and disfavor actions to blow the faves
cache, too.
darcs-hash:20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz
2008-09-28 13:01:19 +01:00
|
|
|
$qry =
|
|
|
|
'SELECT notice.* ' .
|
|
|
|
'FROM notice JOIN reply ON notice.id = reply.notice_id ' .
|
|
|
|
'WHERE reply.profile_id = %d ';
|
2008-12-08 03:10:08 +00:00
|
|
|
|
single function for important streams, with memcached support
I moved the 4 streams for a user (with friends, faves, replies,
personal) into functions on the User object. Added a helper function
in Notice for making notice streams. Also, will fetch notice streams
out of the memcached server, if possible. Made the API, RSS, and HTML
output all use the same streams (hopefully cached).
Added some code to Notice to blow the cache when a notice is posted.
Also, added code to favor and disfavor actions to blow the faves
cache, too.
darcs-hash:20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz
2008-09-28 13:01:19 +01:00
|
|
|
return Notice::getStream(sprintf($qry, $this->id),
|
|
|
|
'user:replies:'.$this->id,
|
2008-12-09 05:53:45 +00:00
|
|
|
$offset, $limit, $since_id, $before_id, NULL, $since);
|
single function for important streams, with memcached support
I moved the 4 streams for a user (with friends, faves, replies,
personal) into functions on the User object. Added a helper function
in Notice for making notice streams. Also, will fetch notice streams
out of the memcached server, if possible. Made the API, RSS, and HTML
output all use the same streams (hopefully cached).
Added some code to Notice to blow the cache when a notice is posted.
Also, added code to favor and disfavor actions to blow the faves
cache, too.
darcs-hash:20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz
2008-09-28 13:01:19 +01:00
|
|
|
}
|
2008-12-08 03:10:08 +00:00
|
|
|
|
2008-12-09 05:53:45 +00:00
|
|
|
function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) {
|
2008-12-08 03:10:08 +00:00
|
|
|
$qry =
|
|
|
|
'SELECT * ' .
|
|
|
|
'FROM notice ' .
|
|
|
|
'WHERE profile_id = %d ';
|
|
|
|
|
|
|
|
return Notice::getStream(sprintf($qry, $this->id),
|
|
|
|
'user:notices:'.$this->id,
|
|
|
|
$offset, $limit, $since_id, $before_id);
|
single function for important streams, with memcached support
I moved the 4 streams for a user (with friends, faves, replies,
personal) into functions on the User object. Added a helper function
in Notice for making notice streams. Also, will fetch notice streams
out of the memcached server, if possible. Made the API, RSS, and HTML
output all use the same streams (hopefully cached).
Added some code to Notice to blow the cache when a notice is posted.
Also, added code to favor and disfavor actions to blow the faves
cache, too.
darcs-hash:20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz
2008-09-28 13:01:19 +01:00
|
|
|
}
|
2008-12-08 03:10:08 +00:00
|
|
|
|
single function for important streams, with memcached support
I moved the 4 streams for a user (with friends, faves, replies,
personal) into functions on the User object. Added a helper function
in Notice for making notice streams. Also, will fetch notice streams
out of the memcached server, if possible. Made the API, RSS, and HTML
output all use the same streams (hopefully cached).
Added some code to Notice to blow the cache when a notice is posted.
Also, added code to favor and disfavor actions to blow the faves
cache, too.
darcs-hash:20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz
2008-09-28 13:01:19 +01:00
|
|
|
function favoriteNotices($offset=0, $limit=NOTICES_PER_PAGE) {
|
|
|
|
$qry =
|
|
|
|
'SELECT notice.* ' .
|
|
|
|
'FROM notice JOIN fave ON notice.id = fave.notice_id ' .
|
2008-09-28 18:43:16 +01:00
|
|
|
'WHERE fave.user_id = %d ';
|
2008-12-08 03:10:08 +00:00
|
|
|
|
single function for important streams, with memcached support
I moved the 4 streams for a user (with friends, faves, replies,
personal) into functions on the User object. Added a helper function
in Notice for making notice streams. Also, will fetch notice streams
out of the memcached server, if possible. Made the API, RSS, and HTML
output all use the same streams (hopefully cached).
Added some code to Notice to blow the cache when a notice is posted.
Also, added code to favor and disfavor actions to blow the faves
cache, too.
darcs-hash:20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz
2008-09-28 13:01:19 +01:00
|
|
|
return Notice::getStream(sprintf($qry, $this->id),
|
|
|
|
'user:faves:'.$this->id,
|
|
|
|
$offset, $limit);
|
|
|
|
}
|
2008-12-08 03:10:08 +00:00
|
|
|
|
2008-12-09 05:53:45 +00:00
|
|
|
function noticesWithFriends($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) {
|
2008-11-13 21:57:34 +00:00
|
|
|
$enabled = common_config('inboxes', 'enabled');
|
2008-10-01 01:12:33 +01:00
|
|
|
|
2008-11-13 21:57:34 +00:00
|
|
|
# Complicated code, depending on whether we support inboxes yet
|
|
|
|
# XXX: make this go away when inboxes become mandatory
|
2008-12-08 03:10:08 +00:00
|
|
|
|
|
|
|
if ($enabled === false ||
|
2008-11-13 21:57:34 +00:00
|
|
|
($enabled == 'transitional' && $this->inboxed == 0)) {
|
|
|
|
$qry =
|
|
|
|
'SELECT notice.* ' .
|
|
|
|
'FROM notice JOIN subscription ON notice.profile_id = subscription.subscribed ' .
|
|
|
|
'WHERE subscription.subscriber = %d ';
|
|
|
|
$order = NULL;
|
|
|
|
} else if ($enabled === true ||
|
2008-12-08 03:10:08 +00:00
|
|
|
($enabled == 'transitional' && $this->inboxed == 1)) {
|
2008-11-13 21:57:34 +00:00
|
|
|
$qry =
|
|
|
|
'SELECT notice.* ' .
|
|
|
|
'FROM notice JOIN notice_inbox ON notice.id = notice_inbox.notice_id ' .
|
|
|
|
'WHERE notice_inbox.user_id = %d ';
|
|
|
|
# NOTE: we override ORDER
|
|
|
|
$order = 'ORDER BY notice_inbox.created DESC, notice_inbox.notice_id DESC ';
|
|
|
|
}
|
2008-12-08 03:10:08 +00:00
|
|
|
|
single function for important streams, with memcached support
I moved the 4 streams for a user (with friends, faves, replies,
personal) into functions on the User object. Added a helper function
in Notice for making notice streams. Also, will fetch notice streams
out of the memcached server, if possible. Made the API, RSS, and HTML
output all use the same streams (hopefully cached).
Added some code to Notice to blow the cache when a notice is posted.
Also, added code to favor and disfavor actions to blow the faves
cache, too.
darcs-hash:20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz
2008-09-28 13:01:19 +01:00
|
|
|
return Notice::getStream(sprintf($qry, $this->id),
|
|
|
|
'user:notices_with_friends:' . $this->id,
|
2008-11-12 17:25:17 +00:00
|
|
|
$offset, $limit, $since_id, $before_id,
|
2008-12-09 05:53:45 +00:00
|
|
|
$order, $since);
|
single function for important streams, with memcached support
I moved the 4 streams for a user (with friends, faves, replies,
personal) into functions on the User object. Added a helper function
in Notice for making notice streams. Also, will fetch notice streams
out of the memcached server, if possible. Made the API, RSS, and HTML
output all use the same streams (hopefully cached).
Added some code to Notice to blow the cache when a notice is posted.
Also, added code to favor and disfavor actions to blow the faves
cache, too.
darcs-hash:20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz
2008-09-28 13:01:19 +01:00
|
|
|
}
|
2008-12-08 03:10:08 +00:00
|
|
|
|
single function for important streams, with memcached support
I moved the 4 streams for a user (with friends, faves, replies,
personal) into functions on the User object. Added a helper function
in Notice for making notice streams. Also, will fetch notice streams
out of the memcached server, if possible. Made the API, RSS, and HTML
output all use the same streams (hopefully cached).
Added some code to Notice to blow the cache when a notice is posted.
Also, added code to favor and disfavor actions to blow the faves
cache, too.
darcs-hash:20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz
2008-09-28 13:01:19 +01:00
|
|
|
function blowFavesCache() {
|
|
|
|
$cache = common_memcache();
|
|
|
|
if ($cache) {
|
2008-11-22 16:52:34 +00:00
|
|
|
# Faves don't happen chronologically, so we need to blow
|
|
|
|
# ;last cache, too
|
single function for important streams, with memcached support
I moved the 4 streams for a user (with friends, faves, replies,
personal) into functions on the User object. Added a helper function
in Notice for making notice streams. Also, will fetch notice streams
out of the memcached server, if possible. Made the API, RSS, and HTML
output all use the same streams (hopefully cached).
Added some code to Notice to blow the cache when a notice is posted.
Also, added code to favor and disfavor actions to blow the faves
cache, too.
darcs-hash:20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz
2008-09-28 13:01:19 +01:00
|
|
|
$cache->delete(common_cache_key('user:faves:'.$this->id));
|
2008-11-22 16:52:34 +00:00
|
|
|
$cache->delete(common_cache_key('user:faves:'.$this->id).';last');
|
single function for important streams, with memcached support
I moved the 4 streams for a user (with friends, faves, replies,
personal) into functions on the User object. Added a helper function
in Notice for making notice streams. Also, will fetch notice streams
out of the memcached server, if possible. Made the API, RSS, and HTML
output all use the same streams (hopefully cached).
Added some code to Notice to blow the cache when a notice is posted.
Also, added code to favor and disfavor actions to blow the faves
cache, too.
darcs-hash:20080928120119-5ed1f-ead542348bcd3cf315be6f42934353154402eb16.gz
2008-09-28 13:01:19 +01:00
|
|
|
}
|
|
|
|
}
|
2008-12-08 03:10:08 +00:00
|
|
|
|
2008-11-20 21:48:21 +00:00
|
|
|
function getSelfTags() {
|
|
|
|
return Profile_tag::getTags($this->id, $this->id);
|
|
|
|
}
|
2008-12-08 03:10:08 +00:00
|
|
|
|
2008-11-20 21:48:21 +00:00
|
|
|
function setSelfTags($newtags) {
|
|
|
|
return Profile_tag::setTags($this->id, $this->id, $newtags);
|
|
|
|
}
|
2008-12-08 18:57:28 +00:00
|
|
|
|
|
|
|
function block($other) {
|
|
|
|
|
|
|
|
# Add a new block record
|
|
|
|
|
|
|
|
$block = new Profile_block();
|
|
|
|
|
|
|
|
# Begin a transaction
|
|
|
|
|
|
|
|
$block->query('BEGIN');
|
|
|
|
|
|
|
|
$block->blocker = $this->id;
|
|
|
|
$block->blocked = $other->id;
|
|
|
|
|
|
|
|
$result = $block->insert();
|
|
|
|
|
|
|
|
if (!$result) {
|
|
|
|
common_log_db_error($block, 'INSERT', __FILE__);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
# Cancel their subscription, if it exists
|
|
|
|
|
|
|
|
$sub = Subscription::pkeyGet(array('subscriber' => $other->id,
|
|
|
|
'subscribed' => $this->id));
|
|
|
|
|
|
|
|
if ($sub) {
|
|
|
|
$result = $sub->delete();
|
|
|
|
if (!$result) {
|
|
|
|
common_log_db_error($sub, 'DELETE', __FILE__);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$block->query('COMMIT');
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
function unblock($other) {
|
|
|
|
|
|
|
|
# Get the block record
|
|
|
|
|
2008-12-09 04:16:48 +00:00
|
|
|
$block = Profile_block::get($this->id, $other->id);
|
2008-12-08 18:57:28 +00:00
|
|
|
|
|
|
|
if (!$block) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
$result = $block->delete();
|
|
|
|
|
|
|
|
if (!$result) {
|
|
|
|
common_log_db_error($block, 'DELETE', __FILE__);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2008-05-07 18:15:42 +01:00
|
|
|
}
|