3 * Laconica - a distributed open-source microblogging tool
4 * Copyright (C) 2008, Controlez-Vous, 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('LACONICA')) { exit(1); }
22 function get_twitter_data($uri, $screen_name, $password) {
25 CURLOPT_USERPWD => sprintf("%s:%s", $screen_name, $password),
26 CURLOPT_RETURNTRANSFER => true,
27 CURLOPT_FAILONERROR => true,
28 CURLOPT_HEADER => false,
29 CURLOPT_FOLLOWLOCATION => true,
30 // CURLOPT_USERAGENT => "identi.ca",
31 CURLOPT_CONNECTTIMEOUT => 120,
32 CURLOPT_TIMEOUT => 120
36 $ch = curl_init($uri);
37 curl_setopt_array($ch, $options);
38 $data = curl_exec($ch);
39 $errmsg = curl_error($ch);
42 common_debug("Twitter bridge - cURL error: $errmsg - trying to load: $uri with user $twit_user.",
51 function twitter_user_info($screen_name, $password) {
53 $uri = "http://twitter.com/users/show/$screen_name.json";
54 $data = get_twitter_data($uri, $screen_name, $password);
60 $twit_user = json_decode($data);
69 function update_twitter_user($fuser, $twitter_id, $screen_name) {
71 $original = clone($fuser);
72 $fuser->nickname = $screen_name;
73 $fuser->uri = 'http://twitter.com/' . $screen_name;
74 $result = $fuser->updateKeys($original);
77 common_log_db_error($fuser, 'UPDATE', __FILE__);
84 function add_twitter_user($twitter_id, $screen_name) {
86 // Otherwise, create a new Twitter user
87 $fuser = DB_DataObject::factory('foreign_user');
89 $fuser->nickname = $screen_name;
90 $fuser->uri = 'http://twitter.com/' . $screen_name;
91 $fuser->id = $twitter_id;
92 $fuser->service = 1; // Twitter
93 $fuser->created = common_sql_now();
94 $result = $fuser->insert();
97 common_debug("Twitter bridge - failed to add new Twitter user: $twitter_id - $screen_name.");
98 common_log_db_error($fuser, 'INSERT', __FILE__);
102 common_debug("Twitter bridge - Added new Twitter user: $screen_name ($twitter_id).");
107 // Creates or Updates a Twitter user
108 function save_twitter_user($twitter_id, $screen_name) {
110 // Check to see whether the Twitter user is already in the system,
111 // and update its screen name and uri if so.
112 $fuser = Foreign_User::getForeignUser($twitter_id, 1);
116 // Only update if Twitter screen name has changed
117 if ($fuser->nickname != $screen_name) {
119 common_debug('Twitter bridge - Updated nickname (and URI) for Twitter user ' .
120 "$fuser->id to $screen_name, was $fuser->nickname");
122 return update_twitter_user($fuser, $twitter_id, $screen_name);
126 return add_twitter_user($twitter_id, $screen_name);
132 function retreive_twitter_friends($twitter_id, $screen_name, $password) {
134 $uri = "http://twitter.com/statuses/friends/$twitter_id.json?page=";
135 $twitter_user = twitter_user_info($screen_name, $password);
137 // Calculate how many pages to get...
138 $pages = ceil($twitter_user->friends_count / 100);
141 common_debug("Twitter bridge - Twitter user $screen_name has no friends! Lame.");
146 for ($i = 1; $i <= $pages; $i++) {
148 $data = get_twitter_data($uri . $i, $screen_name, $password);
154 $more_friends = json_decode($data);
156 if (!$more_friends) {
160 $friends = array_merge($friends, $more_friends);
166 function save_twitter_friends($user, $twitter_id, $screen_name, $password) {
168 $friends = retreive_twitter_friends($twitter_id, $screen_name, $password);
170 if (is_null($friends)) {
171 common_debug("Twitter bridge - Couldn't get friends data from Twitter.");
175 foreach ($friends as $friend) {
177 $friend_name = $friend->screen_name;
178 $friend_id = $friend->id;
180 // Update or create the Foreign_user record
181 if (!save_twitter_user($friend_id, $friend_name)) {
185 // Check to see if there's a related local user
186 $flink = Foreign_link::getByForeignID($friend_id, 1);
190 // Get associated user and subscribe her
191 $friend_user = User::staticGet('id', $flink->user_id);
192 subs_subscribe_to($user, $friend_user);
193 common_debug("Twitter bridge - subscribed $friend_user->nickname to $user->nickname.");