3 * StatusNet - the distributed open-source microblogging tool
4 * Copyright (C) 2010, StatusNet, Inc.
6 * When a new user registers, all existing users follow them automatically.
10 * This program is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU Affero General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Affero General Public License for more details.
20 * You should have received a copy of the GNU Affero General Public License
21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
25 * @author Evan Prodromou <evan@status.net>
26 * @copyright 2010 StatusNet, Inc.
27 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
28 * @link http://status.net/
31 if (!defined('STATUSNET')) {
32 // This check helps protect against security problems;
33 // your code file can't be executed directly from the web.
38 * Plugin to make all users follow each other at registration
40 * Users can unfollow afterwards if they want.
44 * @author Evan Prodromou <evan@status.net>
45 * @copyright 2010 StatusNet, Inc.
46 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
47 * @link http://status.net/
50 class FollowEveryonePlugin extends Plugin
53 * Called when a new user is registered.
55 * We find all users, and try to subscribe them to the new user, and
56 * the new user to them. Exceptions (like silenced users or whatever)
57 * are caught, logged, and ignored.
59 * @param Profile &$newProfile The new user's profile
60 * @param User &$newUser The new user
62 * @return boolean hook value
66 function onEndUserRegister(&$newProfile, &$newUser)
68 $otherUser = new User();
69 $otherUser->whereAdd('id != ' . $newUser->id);
71 if ($otherUser->find()) {
72 while ($otherUser->fetch()) {
73 $otherProfile = $otherUser->getProfile();
75 if (User_followeveryone_prefs::followEveryone($otherUser->id)) {
76 Subscription::start($otherProfile, $newProfile);
78 Subscription::start($newProfile, $otherProfile);
79 } catch (Exception $e) {
80 common_log(LOG_WARNING, $e->getMessage());
86 $ufep = new User_followeveryone_prefs();
88 $ufep->user_id = $newUser->id;
89 $ufep->followeveryone = true;
97 * Database schema setup
99 * Plugins can add their own tables to the StatusNet database. Plugins
100 * should use StatusNet's schema interface to add or delete tables. The
101 * ensureTable() method provides an easy way to ensure a table's structure
104 * By default, the schema is checked every time StatusNet is run (say, when
105 * a Web page is hit). Admins can configure their systems to only check the
106 * schema when the checkschema.php script is run, greatly improving performance.
107 * However, they need to remember to run that script after installing or
108 * upgrading a plugin!
113 * @return boolean hook value; true means continue processing, false means stop.
116 function onCheckSchema()
118 $schema = Schema::get();
120 // For storing user-submitted flags on profiles
122 $schema->ensureTable('user_followeveryone_prefs',
123 array(new ColumnDef('user_id', 'integer', null,
125 new ColumnDef('followeveryone', 'tinyint', null,
132 * Load related modules when needed
134 * @param string $cls Name of the class to be loaded
136 * @return boolean hook value; true means continue processing, false means stop.
139 function onAutoload($cls)
141 $dir = dirname(__FILE__);
145 case 'User_followeveryone_prefs':
146 include_once $dir . '/'.$cls.'.php';
154 * Show a checkbox on the profile form to ask whether to follow everyone
156 * @param Action $action The action being executed
158 * @return boolean hook value
161 function onEndProfileFormData($action)
163 $user = common_current_user();
165 $action->elementStart('li');
166 // TRANS: Checkbox label in form for profile settings.
167 $action->checkbox('followeveryone', _('Follow everyone'),
168 ($action->arg('followeveryone')) ?
169 $action->arg('followeveryone') :
170 User_followeveryone_prefs::followEveryone($user->id));
171 $action->elementEnd('li');
177 * Save checkbox value for following everyone
179 * @param Action $action The action being executed
181 * @return boolean hook value
184 function onEndProfileSaveForm($action)
186 $user = common_current_user();
188 User_followeveryone_prefs::savePref($user->id,
189 $action->boolean('followeveryone'));
195 * Provide version information about this plugin.
197 * @param Array &$versions Array of version data
199 * @return boolean hook value
203 function onPluginVersion(&$versions)
205 $versions[] = array('name' => 'FollowEveryone',
206 'version' => STATUSNET_VERSION,
207 'author' => 'Evan Prodromou',
208 'homepage' => 'http://status.net/wiki/Plugin:FollowEveryone',
210 _m('New users follow everyone at registration and are followed in return.'));