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
63 function onEndUserRegister(&$newProfile, &$newUser)
65 $otherUser = new User();
66 $otherUser->whereAdd('id != ' . $newUser->id);
68 if ($otherUser->find()) {
69 while ($otherUser->fetch()) {
70 $otherProfile = $otherUser->getProfile();
72 if (User_followeveryone_prefs::followEveryone($otherUser->id)) {
73 Subscription::start($otherProfile, $newProfile);
75 Subscription::start($newProfile, $otherProfile);
76 } catch (Exception $e) {
77 common_log(LOG_WARNING, $e->getMessage());
83 $ufep = new User_followeveryone_prefs();
85 $ufep->user_id = $newUser->id;
86 $ufep->followeveryone = true;
94 * Database schema setup
96 * Plugins can add their own tables to the StatusNet database. Plugins
97 * should use StatusNet's schema interface to add or delete tables. The
98 * ensureTable() method provides an easy way to ensure a table's structure
101 * By default, the schema is checked every time StatusNet is run (say, when
102 * a Web page is hit). Admins can configure their systems to only check the
103 * schema when the checkschema.php script is run, greatly improving performance.
104 * However, they need to remember to run that script after installing or
105 * upgrading a plugin!
110 * @return boolean hook value; true means continue processing, false means stop.
112 function onCheckSchema()
114 $schema = Schema::get();
116 // For storing user-submitted flags on profiles
117 $schema->ensureTable('user_followeveryone_prefs', User_followeveryone_prefs::schemaDef());
123 * Load related modules when needed
125 * @param string $cls Name of the class to be loaded
127 * @return boolean hook value; true means continue processing, false means stop.
129 function onAutoload($cls)
131 $dir = dirname(__FILE__);
135 case 'User_followeveryone_prefs':
136 include_once $dir . '/'.$cls.'.php';
144 * Show a checkbox on the profile form to ask whether to follow everyone
146 * @param Action $action The action being executed
148 * @return boolean hook value
150 function onEndProfileFormData($action)
152 $user = common_current_user();
154 $action->elementStart('li');
155 // TRANS: Checkbox label in form for profile settings.
156 $action->checkbox('followeveryone', _m('Follow everyone'),
157 ($action->arg('followeveryone')) ?
158 $action->arg('followeveryone') :
159 User_followeveryone_prefs::followEveryone($user->id));
160 $action->elementEnd('li');
166 * Save checkbox value for following everyone
168 * @param Action $action The action being executed
170 * @return boolean hook value
172 function onEndProfileSaveForm($action)
174 $user = common_current_user();
176 User_followeveryone_prefs::savePref($user->id,
177 $action->boolean('followeveryone'));
183 * Provide version information about this plugin.
185 * @param Array &$versions Array of version data
187 * @return boolean hook value
190 function onPluginVersion(&$versions)
192 $versions[] = array('name' => 'FollowEveryone',
193 'version' => STATUSNET_VERSION,
194 'author' => 'Evan Prodromou',
195 'homepage' => 'http://status.net/wiki/Plugin:FollowEveryone',
197 // TRANS: Plugin description.
198 _m('New users follow everyone at registration and are followed in return.'));