]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/subs.php
let avatars be served over SSL
[quix0rs-gnu-social.git] / lib / subs.php
index 51ae54059f8dda989a8e6ceeffc14b1900760390..5ac1a75a5ce80aecf1fa70221451aa5edb0c3ae3 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /*
- * Laconica - a distributed open-source microblogging tool
- * Copyright (C) 2008, Controlez-Vous, Inc.
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2008, 2009, StatusNet, 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
@@ -17,7 +17,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-if (!defined('LACONICA')) { exit(1); }
+if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
 
 require_once('XMPPHP/XMPP.php');
 
@@ -25,103 +25,155 @@ require_once('XMPPHP/XMPP.php');
   Returns true or an error message.
 */
 
-function subs_subscribe_user($user,$other_nickname) {
+function subs_subscribe_user($user, $other_nickname)
+{
 
-       $other = User::staticGet('nickname', $other_nickname);
+    $other = User::staticGet('nickname', $other_nickname);
 
-       if (!$other) {
-               return _('No such user.');
-       }
+    if (!$other) {
+        return _('No such user.');
+    }
 
-       return subs_subscribe_to($user, $other);
+    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;
+/* Subscribe user $user to other user $other.
+ * Note: $other must be a local user, not a remote profile.
+ * Because the other way is quite a bit more complicated.
+ */
+
+function subs_subscribe_to($user, $other)
+{
+    if (!$user->hasRight(Right::SUBSCRIBE)) {
+        return _('You have been banned from subscribing.');
+    }
+
+    if ($user->isSubscribed($other)) {
+        return _('Already subscribed!');
+    }
+
+    if ($other->hasBlocked($user)) {
+        return _('User has blocked you.');
+    }
+
+    try {
+        if (Event::handle('StartSubscribe', array($user, $other))) {
+
+            if (!$user->subscribeTo($other)) {
+                return _('Could not subscribe.');
+                return;
+            }
+
+            subs_notify($other, $user);
+
+            $cache = common_memcache();
+
+            if ($cache) {
+                $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+            }
+
+            $profile = $user->getProfile();
+
+            $profile->blowSubscriptionsCount();
+            $other->blowSubscribersCount();
+
+            if ($other->autosubscribe && !$other->isSubscribed($user) && !$user->hasBlocked($other)) {
+                if (!$other->subscribeTo($user)) {
+                    return _('Could not subscribe other to you.');
+                }
+                $cache = common_memcache();
+
+                if ($cache) {
+                    $cache->delete(common_cache_key('user:notices_with_friends:' . $other->id));
+                }
+
+                subs_notify($user, $other);
+            }
+
+            Event::handle('EndSubscribe', array($user, $other));
+        }
+    } catch (Exception $e) {
+        return $e->getMessage();
+    }
+
+    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($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);
+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);
+function subs_unsubscribe_user($user, $other_nickname)
+{
 
-       if (!$other) {
-               return _('No such user.');
-       }
+    $other = User::staticGet('nickname', $other_nickname);
 
-       return subs_unsubscribe_to($user, $other);
+    if (!$other) {
+        return _('No such user.');
+    }
+
+    return subs_unsubscribe_to($user, $other->getProfile());
 }
 
-function subs_unsubscribe_to($user, $other) {
+/* Unsubscribe user $user from profile $other
+ * NB: other can be a remote user. */
+
+function subs_unsubscribe_to($user, $other)
+{
+    if (!$user->isSubscribed($other))
+        return _('Not subscribed!');
+
+    // Don't allow deleting self subs
+
+    if ($user->id == $other->id) {
+        return _('Couldn\'t delete self-subscription.');
+    }
+
+    try {
+        if (Event::handle('StartUnsubscribe', array($user, $other))) {
+
+            $sub = DB_DataObject::factory('subscription');
+
+            $sub->subscriber = $user->id;
+            $sub->subscribed = $other->id;
+
+            $sub->find(true);
+
+            // note we checked for existence above
 
-       if (!$user->isSubscribed($other))
-               return _('Not subscribed!.');
+            if (!$sub->delete())
+              return _('Couldn\'t delete subscription.');
 
-       $sub = DB_DataObject::factory('subscription');
+            $cache = common_memcache();
 
-       $sub->subscriber = $user->id;
-       $sub->subscribed = $other->id;
+            if ($cache) {
+                $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+            }
 
-       $sub->find(true);
+            $profile = $user->getProfile();
 
-       // note we checked for existence above
+            $profile->blowSubscriptionsCount();
+            $other->blowSubscribersCount();
 
-       if (!$sub->delete())
-               return _('Couldn\'t delete subscription.');
+            Event::handle('EndUnsubscribe', array($user, $other));
+        }
+    } catch (Exception $e) {
+        return $e->getMessage();
+    }
 
-       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;
+    return true;
 }