| 18 */ |
18 */ |
| 19 |
19 |
| 20 #include "myspace.h" |
20 #include "myspace.h" |
| 21 |
21 |
| 22 static void msim_store_user_info_each(const gchar *key_str, gchar *value_str, MsimUser *user); |
22 static void msim_store_user_info_each(const gchar *key_str, gchar *value_str, MsimUser *user); |
| 23 static gchar *msim_format_now_playing(gchar *band, gchar *song); |
23 static gchar *msim_format_now_playing(const gchar *band, const gchar *song); |
| 24 static void msim_downloaded_buddy_icon(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, |
24 static void msim_downloaded_buddy_icon(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, |
| 25 gsize len, const gchar *error_message); |
25 gsize len, const gchar *error_message); |
| 26 |
26 |
| 27 /** Format the "now playing" indicator, showing the artist and song. |
27 /** Format the "now playing" indicator, showing the artist and song. |
| 28 * @return Return a new string (must be g_free()'d), or NULL. |
28 * @return Return a new string (must be g_free()'d), or NULL. |
| 29 */ |
29 */ |
| 30 static gchar * |
30 static gchar * |
| 31 msim_format_now_playing(gchar *band, gchar *song) |
31 msim_format_now_playing(const gchar *band, const gchar *song) |
| 32 { |
32 { |
| 33 if ((band && *band) || (song && *song)) { |
33 if ((band && *band) || (song && *song)) { |
| 34 return g_strdup_printf("%s - %s", |
34 return g_strdup_printf("%s - %s", |
| 35 (band && *band) ? band : "Unknown Artist", |
35 (band && *band) ? band : "Unknown Artist", |
| 36 (song && *song) ? song : "Unknown Song"); |
36 (song && *song) ? song : "Unknown Song"); |
| 83 * Used by msim_tooltip_text() and msim_get_info_cb() to show a user's profile. |
83 * Used by msim_tooltip_text() and msim_get_info_cb() to show a user's profile. |
| 84 */ |
84 */ |
| 85 void |
85 void |
| 86 msim_append_user_info(MsimSession *session, PurpleNotifyUserInfo *user_info, MsimUser *user, gboolean full) |
86 msim_append_user_info(MsimSession *session, PurpleNotifyUserInfo *user_info, MsimUser *user, gboolean full) |
| 87 { |
87 { |
| |
88 PurplePresence *presence; |
| 88 gchar *str; |
89 gchar *str; |
| 89 guint uid; |
90 guint uid; |
| 90 guint cv; |
91 guint cv; |
| 91 |
92 |
| 92 /* Useful to identify the account the tooltip refers to. |
93 /* Useful to identify the account the tooltip refers to. |
| 126 /* Other information */ |
127 /* Other information */ |
| 127 if (user->headline && *user->headline) { |
128 if (user->headline && *user->headline) { |
| 128 purple_notify_user_info_add_pair(user_info, _("Headline"), user->headline); |
129 purple_notify_user_info_add_pair(user_info, _("Headline"), user->headline); |
| 129 } |
130 } |
| 130 |
131 |
| 131 str = msim_format_now_playing(user->band_name, user->song_name); |
132 presence = purple_buddy_get_presence(user->buddy); |
| 132 if (str && *str) { |
133 |
| 133 purple_notify_user_info_add_pair(user_info, _("Song"), str); |
134 if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_TUNE)) { |
| 134 } |
135 PurpleStatus *status; |
| 135 g_free(str); |
136 const char *artist, *title; |
| |
137 |
| |
138 status = purple_presence_get_status(presence, "tune"); |
| |
139 title = purple_status_get_attr_string(status, PURPLE_TUNE_TITLE); |
| |
140 artist = purple_status_get_attr_string(status, PURPLE_TUNE_ARTIST); |
| |
141 |
| |
142 str = msim_format_now_playing(artist, title); |
| |
143 if (str && *str) { |
| |
144 purple_notify_user_info_add_pair(user_info, _("Song"), str); |
| |
145 } |
| |
146 g_free(str); |
| |
147 } |
| 136 |
148 |
| 137 /* Note: total friends only available if looked up by uid, not username. */ |
149 /* Note: total friends only available if looked up by uid, not username. */ |
| 138 if (user->total_friends) { |
150 if (user->total_friends) { |
| 139 char friends[16]; |
151 char friends[16]; |
| 140 g_snprintf(friends, sizeof(friends), "%d", user->total_friends); |
152 g_snprintf(friends, sizeof(friends), "%d", user->total_friends); |
| 157 } |
169 } |
| 158 if (client && *client) |
170 if (client && *client) |
| 159 purple_notify_user_info_add_pair(user_info, _("Client Version"), client); |
171 purple_notify_user_info_add_pair(user_info, _("Client Version"), client); |
| 160 g_free(client); |
172 g_free(client); |
| 161 } |
173 } |
| |
174 } |
| |
175 |
| |
176 /** Set the currently playing song artist and or title. |
| |
177 * |
| |
178 * @param user User associated with the now playing information. |
| |
179 * |
| |
180 * @param new_artist New artist to set, or NULL/empty to not change artist. |
| |
181 * |
| |
182 * @param new_title New title to set, or NULL/empty to not change title. |
| |
183 * |
| |
184 * If new_artist and new_title are NULL/empty, deactivate PURPLE_STATUS_TUNE. |
| |
185 * |
| |
186 * This function is useful because it lets you set the artist or title |
| |
187 * individually, which purple_prpl_got_user_status() doesn't do. |
| |
188 */ |
| |
189 static void msim_set_artist_or_title(MsimUser *user, const char *new_artist, const char *new_title) |
| |
190 { |
| |
191 PurplePresence *presence; |
| |
192 const char *prev_artist, *prev_title; |
| |
193 |
| |
194 prev_artist = NULL; |
| |
195 prev_title = NULL; |
| |
196 |
| |
197 if (new_artist && !strlen(new_artist)) |
| |
198 new_artist = NULL; |
| |
199 if (new_title && !strlen(new_title)) |
| |
200 new_title = NULL; |
| |
201 |
| |
202 if (!new_artist && !new_title) { |
| |
203 purple_prpl_got_user_status_deactive(user->buddy->account, user->buddy->name, "tune"); |
| |
204 return; |
| |
205 } |
| |
206 |
| |
207 presence = purple_buddy_get_presence(user->buddy); |
| |
208 |
| |
209 if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_TUNE)) { |
| |
210 PurpleStatus *status; |
| |
211 |
| |
212 status = purple_presence_get_status(presence, "tune"); |
| |
213 prev_title = purple_status_get_attr_string(status, PURPLE_TUNE_TITLE); |
| |
214 prev_artist = purple_status_get_attr_string(status, PURPLE_TUNE_ARTIST); |
| |
215 } |
| |
216 |
| |
217 if (!new_artist) |
| |
218 new_artist = prev_artist; |
| |
219 |
| |
220 if (!new_title) |
| |
221 new_title = prev_title; |
| |
222 |
| |
223 purple_prpl_got_user_status(user->buddy->account, user->buddy->name, "tune", |
| |
224 PURPLE_TUNE_TITLE, new_title, |
| |
225 PURPLE_TUNE_ARTIST, new_artist, |
| |
226 NULL); |
| 162 } |
227 } |
| 163 |
228 |
| 164 /** Store a field of information about a buddy. |
229 /** Store a field of information about a buddy. |
| 165 * |
230 * |
| 166 * @param key_str Key to store. |
231 * @param key_str Key to store. |
| 192 user->total_friends = atol(value_str); |
257 user->total_friends = atol(value_str); |
| 193 } else if (g_str_equal(key_str, "DisplayName")) { |
258 } else if (g_str_equal(key_str, "DisplayName")) { |
| 194 g_free(user->display_name); |
259 g_free(user->display_name); |
| 195 user->display_name = value_str; |
260 user->display_name = value_str; |
| 196 } else if (g_str_equal(key_str, "BandName")) { |
261 } else if (g_str_equal(key_str, "BandName")) { |
| 197 g_free(user->band_name); |
262 msim_set_artist_or_title(user, value_str, NULL); |
| 198 user->band_name = value_str; |
|
| 199 } else if (g_str_equal(key_str, "SongName")) { |
263 } else if (g_str_equal(key_str, "SongName")) { |
| 200 g_free(user->song_name); |
264 msim_set_artist_or_title(user, NULL, value_str); |
| 201 user->song_name = value_str; |
|
| 202 } else if (g_str_equal(key_str, "UserName") || g_str_equal(key_str, "IMName") || g_str_equal(key_str, "NickName")) { |
265 } else if (g_str_equal(key_str, "UserName") || g_str_equal(key_str, "IMName") || g_str_equal(key_str, "NickName")) { |
| 203 /* Ignore because PurpleBuddy knows this already */ |
266 /* Ignore because PurpleBuddy knows this already */ |
| 204 g_free(value_str); |
267 g_free(value_str); |
| 205 } else if (g_str_equal(key_str, "ImageURL") || g_str_equal(key_str, "AvatarURL")) { |
268 } else if (g_str_equal(key_str, "ImageURL") || g_str_equal(key_str, "AvatarURL")) { |
| 206 const gchar *previous_url; |
269 const gchar *previous_url; |