3 * StatusNet - the distributed open-source microblogging tool
4 * Copyright (C) 2009-2010, StatusNet, Inc.
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Affero General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Affero General Public License for more details.
16 * You should have received a copy of the GNU Affero General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
23 * @package SubMirrorPlugin
24 * @maintainer Brion Vibber <brion@status.net>
26 class SubMirrorPlugin extends Plugin
29 * Hook for RouterInitialized event.
31 * @param URLMapper $m path-to-action mapper
32 * @return boolean hook return
34 public function onRouterInitialized(URLMapper $m)
36 $m->connect('settings/mirror',
37 array('action' => 'mirrorsettings'));
38 $m->connect('settings/mirror/add/:provider',
39 array('action' => 'mirrorsettings'),
40 array('provider' => '[A-Za-z0-9_-]+'));
41 $m->connect('settings/mirror/add',
42 array('action' => 'addmirror'));
43 $m->connect('settings/mirror/edit',
44 array('action' => 'editmirror'));
48 function handle($notice)
50 // Is anybody mirroring?
51 $mirror = new SubMirror();
52 $mirror->subscribed = $notice->profile_id;
53 if ($mirror->find()) {
54 while ($mirror->fetch()) {
55 $mirror->repeat($notice);
60 function onPluginVersion(array &$versions)
62 $versions[] = array('name' => 'SubMirror',
63 'version' => GNUSOCIAL_VERSION,
64 'author' => 'Brion Vibber',
65 'homepage' => 'http://status.net/wiki/Plugin:SubMirror',
67 // TRANS: Plugin description.
68 _m('Pull feeds into your timeline!'));
74 * Menu item for personal subscriptions/groups area
76 * @param Action $action action being executed
78 * @return boolean hook return
80 function onEndAccountSettingsNav($action)
82 $action_name = $action->trimmed('action');
84 common_debug("ACTION NAME = " . $action_name);
86 $action->menuItem(common_local_url('mirrorsettings'),
87 // TRANS: SubMirror plugin menu item on user settings page.
88 _m('MENU', 'Mirroring'),
89 // TRANS: SubMirror plugin tooltip for user settings menu item.
90 _m('Configure mirroring of posts from other feeds'),
91 $action_name === 'mirrorsettings');
96 function onCheckSchema()
98 $schema = Schema::get();
99 $schema->ensureTable('submirror', SubMirror::schemaDef());
101 // @hack until key definition support is merged
102 SubMirror::fixIndexes($schema);
107 * Set up queue handlers for outgoing hub pushes
108 * @param QueueManager $qm
109 * @return boolean hook return
111 function onEndInitializeQueueManager(QueueManager $qm)
113 // After each notice save, check if there's any repeat mirrors.
114 $qm->connect('mirror', 'MirrorQueueHandler');
118 function onStartEnqueueNotice($notice, &$transports)
120 $transports[] = 'mirror';
124 * Let the OStatus subscription garbage collection know if we're
125 * making use of a remote feed, so it doesn't get dropped out
128 * @param Ostatus_profile $oprofile
129 * @param int $count in/out
130 * @return mixed hook return value
132 function onOstatus_profileSubscriberCount(Ostatus_profile $oprofile, &$count)
135 $profile = $oprofile->localProfile();
136 $mirror = new SubMirror();
137 $mirror->subscribed = $profile->id;
138 if ($mirror->find()) {
139 while ($mirror->fetch()) {
143 } catch (NoProfileException $e) {
144 // We can't handle this kind of Ostatus_profile since it has no
152 * Add a count of mirrored feeds into a user's profile sidebar stats.
154 * @param Profile $profile
155 * @param array $stats
156 * @return boolean hook return value
158 function onProfileStats($profile, &$stats)
160 $cur = common_current_user();
161 if (!empty($cur) && $cur->id == $profile->id) {
162 $mirror = new SubMirror();
163 $mirror->subscriber = $profile->id;
166 // TRANS: Label in profile statistics section, followed by a count.
167 'label' => _m('Mirrored feeds'),
168 'link' => common_local_url('mirrorsettings'),
169 'value' => $mirror->count(),
172 $insertAt = count($stats);
173 foreach ($stats as $i => $row) {
174 if ($row['id'] == 'groups') {
175 // Slip us in after them.
180 array_splice($stats, $insertAt, 0, array($entry));