]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - plugins/TwitterBridge/scripts/streamtest.php
Merge branch '1.0.x' into 1.1.x
[quix0rs-gnu-social.git] / plugins / TwitterBridge / scripts / streamtest.php
1 <?php
2 /**
3  * StatusNet, the distributed open-source microblogging tool
4  *
5  * PHP version 5
6  *
7  * LICENCE: This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU Affero General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU Affero General Public License for more details.
16  *
17  * You should have received a copy of the GNU Affero General Public License
18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
19  *
20  * @category  Plugin
21  * @package   StatusNet
22  * @author    Brion Vibber <brion@status.net>
23  * @copyright 2010 StatusNet, Inc.
24  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
25  * @link      http://status.net/
26  */
27
28 define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..'));
29
30 $shortoptions = 'n:';
31 $longoptions = array('nick=','import','all','apiroot=');
32
33 $helptext = <<<ENDOFHELP
34 USAGE: streamtest.php -n <username>
35
36   -n --nick=<username> Local user whose Twitter timeline to watch
37      --import          Experimental: run incoming messages through import
38      --all             Experimental: run multiuser; requires nick be the app owner
39      --apiroot=<url>   Provide alternate streaming API root URL
40
41 Attempts a User Stream connection to Twitter as the given user, dumping
42 data as it comes.
43
44 ENDOFHELP;
45
46 require_once INSTALLDIR.'/scripts/commandline.inc';
47 require_once dirname(dirname(__FILE__)) . '/jsonstreamreader.php';
48 require_once dirname(dirname(__FILE__)) . '/twitterstreamreader.php';
49
50 if (have_option('n')) {
51     $nickname = get_option_value('n');
52 } else if (have_option('nick')) {
53     $nickname = get_option_value('nickname');
54 } else {
55     show_help($helptext);
56     exit(0);
57 }
58
59 /**
60  *
61  * @param User $user 
62  * @return TwitterOAuthClient
63  */
64 function twitterAuthForUser(User $user)
65 {
66     $flink = Foreign_link::getByUserID($user->id,
67                                        TWITTER_SERVICE);
68     if (!$flink) {
69         throw new ServerException("No Twitter config for this user.");
70     }
71
72     $token = TwitterOAuthClient::unpackToken($flink->credentials);
73     if (!$token) {
74         throw new ServerException("No Twitter OAuth credentials for this user.");
75     }
76
77     return new TwitterOAuthClient($token->key, $token->secret);
78 }
79
80 function homeStreamForUser(User $user)
81 {
82     $auth = twitterAuthForUser($user);
83     return new TwitterUserStream($auth);
84 }
85
86 function siteStreamForOwner(User $user)
87 {
88     // The user we auth as must be the owner of the application.
89     $auth = twitterAuthForUser($user);
90
91     if (have_option('apiroot')) {
92         $stream = new TwitterSiteStream($auth, get_option_value('apiroot'));
93     } else {
94         $stream = new TwitterSiteStream($auth);
95     }
96
97     // Pull Twitter user IDs for all users we want to pull data for
98     $userIds = array();
99
100     $flink = new Foreign_link();
101     $flink->service = TWITTER_SERVICE;
102     $flink->find();
103
104     while ($flink->fetch()) {
105         if (($flink->noticesync & FOREIGN_NOTICE_RECV) ==
106             FOREIGN_NOTICE_RECV) {
107             $userIds[] = $flink->foreign_id;
108         }
109     }
110
111     $stream->followUsers($userIds);
112     return $stream;
113 }
114
115
116 $user = User::staticGet('nickname', $nickname);
117 global $myuser;
118 $myuser = $user;
119
120 if (have_option('all')) {
121     $stream = siteStreamForOwner($user);
122 } else {
123     $stream = homeStreamForUser($user);
124 }
125
126
127 $stream->hookEvent('raw', function($data, $context) {
128     common_log(LOG_INFO, json_encode($data) . ' for ' . json_encode($context));
129 });
130 $stream->hookEvent('friends', function($data, $context) {
131     printf("Friend list: %s\n", implode(', ', $data->friends));
132 });
133 $stream->hookEvent('favorite', function($data, $context) {
134     printf("%s favorited %s's notice: %s\n",
135             $data->source->screen_name,
136             $data->target->screen_name,
137             $data->target_object->text);
138 });
139 $stream->hookEvent('unfavorite', function($data, $context) {
140     printf("%s unfavorited %s's notice: %s\n",
141             $data->source->screen_name,
142             $data->target->screen_name,
143             $data->target_object->text);
144 });
145 $stream->hookEvent('follow', function($data, $context) {
146     printf("%s friended %s\n",
147             $data->source->screen_name,
148             $data->target->screen_name);
149 });
150 $stream->hookEvent('unfollow', function($data, $context) {
151     printf("%s unfriended %s\n",
152             $data->source->screen_name,
153             $data->target->screen_name);
154 });
155 $stream->hookEvent('delete', function($data, $context) {
156     printf("Deleted status notification: %s\n",
157             $data->status->id);
158 });
159 $stream->hookEvent('scrub_geo', function($data, $context) {
160     printf("Req to scrub geo data for user id %s up to status ID %s\n",
161             $data->user_id,
162             $data->up_to_status_id);
163 });
164 $stream->hookEvent('status', function($data, $context) {
165     printf("Received status update from %s: %s\n",
166             $data->user->screen_name,
167             $data->text);
168
169     if (have_option('import')) {
170         $importer = new TwitterImport();
171         printf("\timporting...");
172         $notice = $importer->importStatus($data);
173         if ($notice) {
174             global $myuser;
175             Inbox::insertNotice($myuser->id, $notice->id);
176             printf(" %s\n", $notice->id);
177         } else {
178             printf(" FAIL\n");
179         }
180     }
181 });
182 $stream->hookEvent('direct_message', function($data) {
183     printf("Direct message from %s to %s: %s\n",
184             $data->sender->screen_name,
185             $data->recipient->screen_name,
186             $data->text);
187 });
188
189 class TwitterManager extends IoManager
190 {
191     function __construct(TwitterStreamReader $stream)
192     {
193         $this->stream = $stream;
194     }
195
196     function getSockets()
197     {
198         return $this->stream->getSockets();
199     }
200
201     function handleInput($data)
202     {
203         $this->stream->handleInput($data);
204         return true;
205     }
206
207     function start()
208     {
209         $this->stream->connect();
210         return true;
211     }
212
213     function finish()
214     {
215         $this->stream->close();
216         return true;
217     }
218
219     public static function get()
220     {
221         throw new Exception('not a singleton');
222     }
223 }
224
225 class TwitterStreamMaster extends IoMaster
226 {
227     function __construct($id, $ioManager)
228     {
229         parent::__construct($id);
230         $this->ioManager = $ioManager;
231     }
232
233     /**
234      * Initialize IoManagers which are appropriate to this instance.
235      */
236     function initManagers()
237     {
238         $this->instantiate($this->ioManager);
239     }
240 }
241
242 $master = new TwitterStreamMaster('TwitterStream', new TwitterManager($stream));
243 $master->init();
244 $master->service();