diff --git a/classes/User.php b/classes/User.php index 62f077739a..84a980db4d 100644 --- a/classes/User.php +++ b/classes/User.php @@ -153,6 +153,52 @@ class User extends DB_DataObject return $notice; } + + function favoriteNotices($offset=0, $limit=20) { + + $notice = new Notice(); + + $notice->query('SELECT notice.* ' . + 'FROM notice JOIN fave on notice.id = fave.notice_id ' . + 'WHERE fave.user_id = ' . $this->id . ' ' . + 'ORDER BY notice.created DESC, notice.id DESC ' . + 'LIMIT ' . $offset . ', ' . $limit); + + return $notice; + } + + function noticesWithFriendsWindow() { + + $cache = new Memcache(); + $res = $cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port')); + + if (!$res) { + return NULL; + } + + $notices = $cache->get(common_cache_key('user:notices_with_friends:' . $this->id)); + + if ($notices) { + return $notices; + } + + $notice = new Notice(); + + $notice->query('SELECT notice.* ' . + 'FROM notice JOIN subscription on notice.profile_id = subscription.subscribed ' . + 'WHERE subscription.subscriber = ' . $this->id . ' ' . + 'ORDER BY created DESC, notice.id DESC ' . + 'LIMIT 0, ' . WITHFRIENDS_CACHE_WINDOW); + + $notices = array(); + + while ($notice->fetch()) { + $notices[] = clone($notice); + } + + $cache->set(common_cache_key('user:notices_with_friends:' . $this->id), $notices); + return $notices; + } static function register($fields) { diff --git a/lib/subs.php b/lib/subs.php new file mode 100644 index 0000000000..51ae54059f --- /dev/null +++ b/lib/subs.php @@ -0,0 +1,127 @@ +. + */ + +if (!defined('LACONICA')) { exit(1); } + +require_once('XMPPHP/XMPP.php'); + +/* Subscribe $user to nickname $other_nickname + Returns true or an error message. +*/ + +function subs_subscribe_user($user,$other_nickname) { + + $other = User::staticGet('nickname', $other_nickname); + + if (!$other) { + return _('No such user.'); + } + + return subs_subscribe_to($user, $other); +} + +function subs_subscribe_to($user, $other) { + + if ($user->isSubscribed($other)) { + return _('Already subscribed!.'); + } + + if (!$user->subscribeTo($other)) { + return _('Could not subscribe.'); + return; + } + + subs_notify($other, $user); + + if (common_config('memcached', 'enabled')) { + $cache = new Memcache(); + if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) { + $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id)); + } + } + + if ($other->autosubscribe && !$other->isSubscribed($user)) { + if (!$other->subscribeTo($user)) { + return _('Could not subscribe other to you.'); + } + if (common_config('memcached', 'enabled')) { + $cache = new Memcache(); + if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) { + $cache->delete(common_cache_key('user:notices_with_friends:' . $other->id)); + } + } + + subs_notify($user, $other); + } + + return true; +} + +function subs_notify($listenee, $listener) { + # XXX: add other notifications (Jabber, SMS) here + # XXX: queue this and handle it offline + # XXX: Whatever happens, do it in Twitter-like API, too + subs_notify_email($listenee, $listener); +} + +function subs_notify_email($listenee, $listener) { + mail_subscribe_notify($listenee, $listener); +} + +/* Unsubscribe $user from nickname $other_nickname + Returns true or an error message. +*/ +function subs_unsubscribe_user($user, $other_nickname) { + + $other = User::staticGet('nickname', $other_nickname); + + if (!$other) { + return _('No such user.'); + } + + return subs_unsubscribe_to($user, $other); +} + +function subs_unsubscribe_to($user, $other) { + + if (!$user->isSubscribed($other)) + return _('Not subscribed!.'); + + $sub = DB_DataObject::factory('subscription'); + + $sub->subscriber = $user->id; + $sub->subscribed = $other->id; + + $sub->find(true); + + // note we checked for existence above + + if (!$sub->delete()) + return _('Couldn\'t delete subscription.'); + + if (common_config('memcached', 'enabled')) { + $cache = new Memcache(); + if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) { + $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id)); + } + } + + return true; +} +