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/
49 class FollowEveryonePlugin extends Plugin
52 * Called when a new user is registered.
54 * We find all users, and try to subscribe them to the new user, and
55 * the new user to them. Exceptions (like silenced users or whatever)
56 * are caught, logged, and ignored.
58 * @param Profile &$newProfile The new user's profile
59 * @param User &$newUser The new user
61 * @return boolean hook value
64 function onEndUserRegister(&$newProfile, &$newUser)
66 $otherUser = new User();
67 $otherUser->whereAdd('id != ' . $newUser->id);
69 if ($otherUser->find()) {
70 while ($otherUser->fetch()) {
71 $otherProfile = $otherUser->getProfile();
73 if (User_followeveryone_prefs::followEveryone($otherUser->id)) {
74 Subscription::start($otherProfile, $newProfile);
76 Subscription::start($newProfile, $otherProfile);
77 } catch (Exception $e) {
78 common_log(LOG_WARNING, $e->getMessage());
84 $ufep = new User_followeveryone_prefs();
86 $ufep->user_id = $newUser->id;
87 $ufep->followeveryone = true;
95 * Database schema setup
97 * Plugins can add their own tables to the StatusNet database. Plugins
98 * should use StatusNet's schema interface to add or delete tables. The
99 * ensureTable() method provides an easy way to ensure a table's structure
102 * By default, the schema is checked every time StatusNet is run (say, when
103 * a Web page is hit). Admins can configure their systems to only check the
104 * schema when the checkschema.php script is run, greatly improving performance.
105 * However, they need to remember to run that script after installing or
106 * upgrading a plugin!
111 * @return boolean hook value; true means continue processing, false means stop.
113 function onCheckSchema()
115 $schema = Schema::get();
117 // For storing user-submitted flags on profiles
119 $schema->ensureTable('user_followeveryone_prefs',
120 array(new ColumnDef('user_id', 'integer', null,
122 new ColumnDef('followeveryone', 'tinyint', null,
129 * Load related modules when needed
131 * @param string $cls Name of the class to be loaded
133 * @return boolean hook value; true means continue processing, false means stop.
135 function onAutoload($cls)
137 $dir = dirname(__FILE__);
141 case 'User_followeveryone_prefs':
142 include_once $dir . '/'.$cls.'.php';
150 * Show a checkbox on the profile form to ask whether to follow everyone
152 * @param Action $action The action being executed
154 * @return boolean hook value
156 function onEndProfileFormData($action)
158 $user = common_current_user();
160 $action->elementStart('li');
161 // TRANS: Checkbox label in form for profile settings.
162 $action->checkbox('followeveryone', _('Follow everyone'),
163 ($action->arg('followeveryone')) ?
164 $action->arg('followeveryone') :
165 User_followeveryone_prefs::followEveryone($user->id));
166 $action->elementEnd('li');
172 * Save checkbox value for following everyone
174 * @param Action $action The action being executed
176 * @return boolean hook value
178 function onEndProfileSaveForm($action)
180 $user = common_current_user();
182 User_followeveryone_prefs::savePref($user->id,
183 $action->boolean('followeveryone'));
189 * Provide version information about this plugin.
191 * @param Array &$versions Array of version data
193 * @return boolean hook value
196 function onPluginVersion(&$versions)
198 $versions[] = array('name' => 'FollowEveryone',
199 'version' => STATUSNET_VERSION,
200 'author' => 'Evan Prodromou',
201 'homepage' => 'http://status.net/wiki/Plugin:FollowEveryone',
203 _m('New users follow everyone at registration and are followed in return.'));