]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
ForceGroup plugin: optionally force new users to join a particular group or set of...
authorBrion Vibber <brion@pobox.com>
Thu, 30 Sep 2010 23:25:15 +0000 (16:25 -0700)
committerBrion Vibber <brion@pobox.com>
Thu, 30 Sep 2010 23:25:15 +0000 (16:25 -0700)
classes/Notice.php
lib/distribqueuehandler.php
plugins/ForceGroup/ForceGroupPlugin.php [new file with mode: 0644]

index 79626f8898535a032e90367f4f4f6c2c9aef7ed8..e268544b5089a619d76cb31316a207f1d18a11ae 100644 (file)
@@ -2034,6 +2034,7 @@ class Notice extends Memcached_DataObject
     {
         // We always insert for the author so they don't
         // have to wait
+        Event::handle('StartNoticeDistribute', array($this));
 
         $user = User::staticGet('id', $this->profile_id);
         if (!empty($user)) {
index 8f4b72d5c37e3128cb782aabea4475d0d1d88a14..a7519c1d50729465000f6155f61d31f20e2bbe5f 100644 (file)
@@ -77,14 +77,20 @@ class DistribQueueHandler
             $this->logit($notice, $e);
         }
 
+        try {
+            Event::handle('EndNoticeDistribute', array($notice));
+        } catch (Exception $e) {
+            $this->logit($notice, $e);
+        }
+
         try {
             Event::handle('EndNoticeSave', array($notice));
-            // Enqueue for other handlers
         } catch (Exception $e) {
             $this->logit($notice, $e);
         }
 
         try {
+            // Enqueue for other handlers
             common_enqueue_notice($notice);
         } catch (Exception $e) {
             $this->logit($notice, $e);
diff --git a/plugins/ForceGroup/ForceGroupPlugin.php b/plugins/ForceGroup/ForceGroupPlugin.php
new file mode 100644 (file)
index 0000000..e0a04fc
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+/*
+ * StatusNet - the distributed open-source microblogging tool
+ * Copyright (C) 2010, 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
+ * 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/>.
+ */
+
+/**
+ * @package ForceGroupPlugin
+ * @maintainer Brion Vibber <brion@status.net>
+ */
+
+if (!defined('STATUSNET')) { exit(1); }
+
+class ForceGroupPlugin extends Plugin
+{
+    /**
+     * Members of these groups will have all their posts mirrored into
+     * the group even if they don't explicitly mention it.
+     *
+     * List by local nickname.
+     */
+    public $post = array();
+    
+    /**
+     * New user registrations will automatically join these groups on
+     * registration. They're not prevented from leaving, however.
+     * 
+     * List by local nickname.
+     */
+    public $join = array();
+
+    /**
+     * If poster is in one of the forced groups, make sure their notice
+     * gets saved into that group even if not explicitly mentioned.
+     *
+     * @param Notice $notice
+     * @return boolean event hook return
+     */
+    function onStartNoticeDistribute($notice)
+    {
+        $profile = $notice->getProfile();
+        foreach ($this->post as $nickname) {
+            $group = User_group::getForNickname($nickname);
+            if ($group && $profile->isMember($group)) {
+                $notice->addToGroupInbox($group);
+            }
+        }
+        return true;
+    }
+
+    function onEndUserRegister($profile, $user)
+    {
+        $profile = $user->getProfile();
+        foreach ($this->join as $nickname) {
+            $group = User_group::getForNickname($nickname);
+            if ($group && !$profile->isMember($group)) {
+                try {
+                    if (Event::handle('StartJoinGroup', array($group, $user))) {
+                        Group_member::join($group->id, $user->id);
+                        Event::handle('EndJoinGroup', array($group, $user));
+                    }
+                } catch (Exception $e) {
+                    throw new ServerException(sprintf(_('Could not join user %1$s to group %2$s.'),
+                                               $user->nickname, $group->nickname));
+                }
+            }
+        }
+    }
+}