Mercurial > pidgin
annotate src/protocols/msn/userlist.c @ 12645:fc28451f5d96
[gaim-migrate @ 14983]
SF Patch #1314512 from Sadrul (who has a patch for everything)
"This patch introduces a flag for protocol plugins that
support offline messages (like Y!M and ICQ). This was
encouraged by the following conversation:
<sadrul> should offline buddies be listed/enabled in
the send-to menu?
<rekkanoryo> i would think only for protocols that
support offline messaging, if it's indicated that the
buddy is offline
-- <snip> --
<Bleeter> sadrul: personally, I'd like to see a
'supports offline' flag of some description
<Bleeter> one could then redirect (via plugins) through
email or alternative methods
<Bleeter> just a thought
<Paco-Paco> yeah, that sounds like a reasonble thing to have
This patch uses this flag to disable the buddies in the
send-to menu who are offline and the protocol doesn't
support offline messages."
I made this make the label insensitive instead of the whole menuitem. This
should address SimGuy's concerns about inconsistency (i.e. you could create a
conversation with someone via the buddy list that you couldn't create via the
Send To menu). I also hacked up some voodoo to show the label as sensitive when
moused-over, as that looks better (given the label-insensitive thing is itself a
hack). I think this works quite well.
BUG NOTE:
This makes more obvious an existing bug. The Send To menu isn't updated when
buddies sign on or off or change status (at least under some circumstances).
We need to fix that anyway, so I'm not going to let it hold up this commit.
Switching tabs will clear it up. I'm thinking we just might want to build the
contents of that menu when it is selected. That would save us a mess of
inefficient signal callbacks that update the Send To menus in open windows all
the time.
AIM NOTE:
This assumes that AIM can't offline message. That's not strictly true. You can
message invisible users on AIM. However, by design, we can't tell when a user
is invisible without resorting to dirty hackery. In practice, this isn't a
problem, as you can still select the AIM user from the menu. And really, how
often will you be choosing the Invisible contact, rather than the user going
Invisible in the middle of a conversation or IMing you while they're Invisible?
JABBER NOTE:
This assumes that Jabber can always offline message. This isn't strictly true.
Sadrul said:
I have updated Jabber according to this link which seems to
talk about how to determine the existence offline-message
support in a server:
http://www.jabber.org/jeps/jep-0013.html#discover
However, jabber.org doesn't seem to send the required
info. So I am not sure about it.
He later said:
I talked to Nathan and he said offline message support is
mostly assumed for most jabber servers. GTalk doesn't yet
support it, but they are working on it. So I have made
jabber to always return TRUE.
If there is truly no way to detect offline messaging capability, then this is
an acceptable solution. We could special case Google Talk because of its
popularity, and remove that later. It's probably not worth it though.
MSN NOTE:
This assumes that MSN can never offline message. That's effectively true, but
to be technically correct, MSN can offline message if there's already a
switchboard conversation open with a user. We could write an offline_message
function in the MSN prpl to detect that, but it'd be of limited usefulness,
especially given that under most circumstances (where this might matter), the
switchboard connection will be closed almost immediately.
CVS NOTE:
I'm writing to share a tragic little story.
I have a PC that I use for Gaim development. One day, I was writing a commit
message on it, when all of a suddent it went berserk. The screen started
flashing, and the whole commit message just disappeared. All of it. And it was
a good commit message! I had to cram and rewrite it really quickly. Needless to
say, my rushed commit message wasn't nearly as good, and I blame the PC for that.
Seriously, though, what kind of version control system loses your commit
message on a broken connection to the server? Stupid!
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Fri, 23 Dec 2005 19:26:04 +0000 |
parents | 29e237c4141b |
children | 442b23efba54 |
rev | line source |
---|---|
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
1 /** |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
2 * @file userlist.c MSN user list support |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
3 * |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
4 * gaim |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
5 * |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
6 * Gaim is the legal property of its developers, whose names are too numerous |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
7 * to list here. Please refer to the COPYRIGHT file distributed with this |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
8 * source distribution. |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
9 * |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
10 * This program is free software; you can redistribute it and/or modify |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
11 * it under the terms of the GNU General Public License as published by |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
12 * the Free Software Foundation; either version 2 of the License, or |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
13 * (at your option) any later version. |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
14 * |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
15 * This program is distributed in the hope that it will be useful, |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
18 * GNU General Public License for more details. |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
19 * |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
20 * You should have received a copy of the GNU General Public License |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
21 * along with this program; if not, write to the Free Software |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
23 */ |
9193 | 24 #include "msn.h" |
25 #include "userlist.h" | |
26 | |
27 const char *lists[] = { "FL", "AL", "BL", "RL" }; | |
28 | |
29 typedef struct | |
30 { | |
31 GaimConnection *gc; | |
32 char *who; | |
12380
553dd80f6130
[gaim-migrate @ 14684]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
33 char *friendly; |
9193 | 34 |
35 } MsnPermitAdd; | |
36 | |
37 /************************************************************************** | |
38 * Callbacks | |
39 **************************************************************************/ | |
40 static void | |
41 msn_accept_add_cb(MsnPermitAdd *pa) | |
42 { | |
43 if (g_list_find(gaim_connections_get_all(), pa->gc) != NULL) | |
44 { | |
45 MsnSession *session = pa->gc->proto_data; | |
46 MsnUserList *userlist = session->userlist; | |
12380
553dd80f6130
[gaim-migrate @ 14684]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
47 GaimBuddy *buddy; |
9193 | 48 |
49 msn_userlist_add_buddy(userlist, pa->who, MSN_LIST_AL, NULL); | |
50 | |
12380
553dd80f6130
[gaim-migrate @ 14684]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
51 buddy = gaim_find_buddy(pa->gc->account, pa->who); |
553dd80f6130
[gaim-migrate @ 14684]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
52 |
553dd80f6130
[gaim-migrate @ 14684]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
53 if (buddy != NULL) |
553dd80f6130
[gaim-migrate @ 14684]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
54 gaim_account_notify_added(pa->gc->account, pa->who, |
553dd80f6130
[gaim-migrate @ 14684]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
55 NULL, pa->friendly, NULL); |
553dd80f6130
[gaim-migrate @ 14684]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
56 else |
553dd80f6130
[gaim-migrate @ 14684]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
57 gaim_account_request_add(pa->gc->account, pa->who, |
553dd80f6130
[gaim-migrate @ 14684]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
58 NULL, pa->friendly, NULL); |
9193 | 59 } |
60 | |
61 g_free(pa->who); | |
12380
553dd80f6130
[gaim-migrate @ 14684]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
62 g_free(pa->friendly); |
9193 | 63 g_free(pa); |
64 } | |
65 | |
66 static void | |
67 msn_cancel_add_cb(MsnPermitAdd *pa) | |
68 { | |
69 if (g_list_find(gaim_connections_get_all(), pa->gc) != NULL) | |
70 { | |
71 MsnSession *session = pa->gc->proto_data; | |
72 MsnUserList *userlist = session->userlist; | |
73 | |
74 msn_userlist_add_buddy(userlist, pa->who, MSN_LIST_BL, NULL); | |
75 } | |
76 | |
77 g_free(pa->who); | |
12380
553dd80f6130
[gaim-migrate @ 14684]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
78 g_free(pa->friendly); |
9193 | 79 g_free(pa); |
80 } | |
81 | |
82 static void | |
9976 | 83 got_new_entry(GaimConnection *gc, const char *passport, const char *friendly) |
9193 | 84 { |
85 MsnPermitAdd *pa; | |
10774 | 86 char *msg; |
9193 | 87 |
12380
553dd80f6130
[gaim-migrate @ 14684]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
88 pa = g_new0(MsnPermitAdd, 1); |
9193 | 89 pa->who = g_strdup(passport); |
12381 | 90 pa->friendly = g_strdup(friendly); |
12380
553dd80f6130
[gaim-migrate @ 14684]
Daniel Atallah <daniel.atallah@gmail.com>
parents:
12318
diff
changeset
|
91 pa->gc = gc; |
9193 | 92 |
9210
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
93 if (friendly != NULL) |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
94 { |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
95 msg = g_strdup_printf( |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
96 _("The user %s (%s) wants to add %s to his or her " |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
97 "buddy list."), |
10774 | 98 passport, friendly, |
9210
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
99 gaim_account_get_username(gc->account)); |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
100 } |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
101 else |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
102 { |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
103 msg = g_strdup_printf( |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
104 _("The user %s wants to add %s to his or " |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
105 "her buddy list."), |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
106 passport, gaim_account_get_username(gc->account)); |
62b601ddb4bc
[gaim-migrate @ 10005]
Christian Hammond <chipx86@chipx86.com>
parents:
9208
diff
changeset
|
107 } |
9193 | 108 |
9976 | 109 gaim_request_action(gc, NULL, msg, NULL, |
9948 | 110 GAIM_DEFAULT_ACTION_NONE, pa, 2, |
9193 | 111 _("Authorize"), G_CALLBACK(msn_accept_add_cb), |
112 _("Deny"), G_CALLBACK(msn_cancel_add_cb)); | |
113 | |
114 g_free(msg); | |
115 } | |
116 | |
117 /************************************************************************** | |
118 * Utility functions | |
119 **************************************************************************/ | |
120 | |
121 static gboolean | |
122 user_is_in_group(MsnUser *user, int group_id) | |
123 { | |
124 if (user == NULL) | |
125 return FALSE; | |
126 | |
127 if (group_id < 0) | |
128 return FALSE; | |
129 | |
130 if (g_list_find(user->group_ids, GINT_TO_POINTER(group_id))) | |
131 return TRUE; | |
132 | |
133 return FALSE; | |
134 } | |
135 | |
136 static gboolean | |
137 user_is_there(MsnUser *user, int list_id, int group_id) | |
138 { | |
139 int list_op; | |
140 | |
141 if (user == NULL) | |
142 return FALSE; | |
143 | |
144 list_op = 1 << list_id; | |
145 | |
146 if (!(user->list_op & list_op)) | |
147 return FALSE; | |
148 | |
149 if (list_id == MSN_LIST_FL) | |
150 { | |
151 if (group_id >= 0) | |
152 return user_is_in_group(user, group_id); | |
153 } | |
154 | |
155 return TRUE; | |
156 } | |
157 | |
158 static const char* | |
159 get_store_name(MsnUser *user) | |
160 { | |
161 const char *store_name; | |
162 | |
163 g_return_val_if_fail(user != NULL, NULL); | |
164 | |
10533 | 165 store_name = msn_user_get_store_name(user); |
166 | |
167 if (store_name != NULL) | |
168 store_name = gaim_url_encode(store_name); | |
169 else | |
170 store_name = msn_user_get_passport(user); | |
9193 | 171 |
10533 | 172 /* this might be a bit of a hack, but it should prevent notification server |
173 * disconnections for people who have buddies with insane friendly names | |
174 * who added you to their buddy list from being disconnected. Stu. */ | |
175 /* Shx: What? Isn't the store_name obtained from the server, and hence it's | |
176 * below the BUDDY_ALIAS_MAXLEN ? */ | |
177 /* Stu: yeah, that's why it's a bit of a hack, as you pointed out, we're | |
178 * probably decoding the incoming store_name wrong, or something. bleh. */ | |
179 | |
180 if (strlen(store_name) > BUDDY_ALIAS_MAXLEN) | |
181 store_name = msn_user_get_passport(user); | |
182 | |
183 return store_name; | |
9193 | 184 } |
185 | |
186 static void | |
187 msn_request_add_group(MsnUserList *userlist, const char *who, | |
188 const char *old_group_name, const char *new_group_name) | |
189 { | |
190 MsnCmdProc *cmdproc; | |
191 MsnTransaction *trans; | |
9218 | 192 MsnMoveBuddy *data; |
9193 | 193 |
194 cmdproc = userlist->session->notification->cmdproc; | |
9218 | 195 data = g_new0(MsnMoveBuddy, 1); |
9193 | 196 |
197 data->who = g_strdup(who); | |
198 | |
199 if (old_group_name) | |
200 data->old_group_name = g_strdup(old_group_name); | |
201 | |
10225 | 202 trans = msn_transaction_new(cmdproc, "ADG", "%s %d", |
9193 | 203 gaim_url_encode(new_group_name), |
204 0); | |
205 | |
206 msn_transaction_set_data(trans, data); | |
207 | |
208 msn_cmdproc_send_trans(cmdproc, trans); | |
209 } | |
210 | |
211 /************************************************************************** | |
212 * Server functions | |
213 **************************************************************************/ | |
214 | |
215 MsnListId | |
216 msn_get_list_id(const char *list) | |
217 { | |
218 if (list[0] == 'F') | |
219 return MSN_LIST_FL; | |
220 else if (list[0] == 'A') | |
221 return MSN_LIST_AL; | |
222 else if (list[0] == 'B') | |
223 return MSN_LIST_BL; | |
224 else if (list[0] == 'R') | |
225 return MSN_LIST_RL; | |
226 | |
227 return -1; | |
228 } | |
229 | |
230 void | |
231 msn_got_add_user(MsnSession *session, MsnUser *user, | |
232 MsnListId list_id, int group_id) | |
233 { | |
234 GaimAccount *account; | |
235 const char *passport; | |
236 const char *friendly; | |
237 | |
238 account = session->account; | |
239 | |
240 passport = msn_user_get_passport(user); | |
241 friendly = msn_user_get_friendly_name(user); | |
9197
ec417d2f9666
[gaim-migrate @ 9992]
Christian Hammond <chipx86@chipx86.com>
parents:
9196
diff
changeset
|
242 |
9193 | 243 if (list_id == MSN_LIST_FL) |
244 { | |
9861 | 245 GaimConnection *gc; |
246 | |
247 gc = gaim_account_get_connection(account); | |
9193 | 248 |
249 serv_got_alias(gc, passport, friendly); | |
250 | |
251 if (group_id >= 0) | |
252 { | |
253 msn_user_add_group_id(user, group_id); | |
254 } | |
255 else | |
256 { | |
257 /* session->sync->fl_users_count++; */ | |
258 } | |
259 } | |
260 else if (list_id == MSN_LIST_AL) | |
261 { | |
262 gaim_privacy_permit_add(account, passport, TRUE); | |
263 } | |
264 else if (list_id == MSN_LIST_BL) | |
265 { | |
266 gaim_privacy_deny_add(account, passport, TRUE); | |
267 } | |
268 else if (list_id == MSN_LIST_RL) | |
269 { | |
9861 | 270 GaimConnection *gc; |
11039
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
271 GaimConversation *convo; |
9861 | 272 |
273 gc = gaim_account_get_connection(account); | |
9193 | 274 |
275 gaim_debug_info("msn", | |
12318
e346a085bb4f
[gaim-migrate @ 14622]
Richard Laager <rlaager@wiktel.com>
parents:
11638
diff
changeset
|
276 "%s has added you to his or her buddy list.\n", |
9193 | 277 passport); |
278 | |
11338 | 279 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, passport, account); |
11039
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
280 if (convo) { |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
281 GaimBuddy *buddy; |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
282 char *msg; |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
283 |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
284 buddy = gaim_find_buddy(account, passport); |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
285 msg = g_strdup_printf( |
12318
e346a085bb4f
[gaim-migrate @ 14622]
Richard Laager <rlaager@wiktel.com>
parents:
11638
diff
changeset
|
286 _("%s has added you to his or her buddy list."), |
11039
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
287 buddy ? gaim_buddy_get_contact_alias(buddy) : passport); |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
288 gaim_conv_im_write(GAIM_CONV_IM(convo), passport, msg, |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
289 GAIM_MESSAGE_SYSTEM, time(NULL)); |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
290 g_free(msg); |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
291 } |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
292 |
10583 | 293 if (!(user->list_op & (MSN_LIST_AL_OP | MSN_LIST_BL_OP))) |
9223
f46154d6de2b
[gaim-migrate @ 10019]
Christian Hammond <chipx86@chipx86.com>
parents:
9218
diff
changeset
|
294 { |
9193 | 295 got_new_entry(gc, passport, friendly); |
9223
f46154d6de2b
[gaim-migrate @ 10019]
Christian Hammond <chipx86@chipx86.com>
parents:
9218
diff
changeset
|
296 } |
9193 | 297 } |
298 | |
299 user->list_op |= (1 << list_id); | |
300 /* gaim_user_add_list_id (user, list_id); */ | |
301 } | |
302 | |
303 void | |
304 msn_got_rem_user(MsnSession *session, MsnUser *user, | |
305 MsnListId list_id, int group_id) | |
306 { | |
307 GaimAccount *account; | |
308 const char *passport; | |
309 | |
310 account = session->account; | |
311 | |
312 passport = msn_user_get_passport(user); | |
313 | |
314 if (list_id == MSN_LIST_FL) | |
315 { | |
316 /* TODO: When is the user totally removed? */ | |
317 if (group_id >= 0) | |
318 { | |
319 msn_user_remove_group_id(user, group_id); | |
320 return; | |
321 } | |
322 else | |
323 { | |
324 /* session->sync->fl_users_count--; */ | |
325 } | |
326 } | |
327 else if (list_id == MSN_LIST_AL) | |
328 { | |
329 gaim_privacy_permit_remove(account, passport, TRUE); | |
330 } | |
331 else if (list_id == MSN_LIST_BL) | |
332 { | |
333 gaim_privacy_deny_remove(account, passport, TRUE); | |
334 } | |
335 else if (list_id == MSN_LIST_RL) | |
336 { | |
11039
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
337 GaimConversation *convo; |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
338 |
9193 | 339 gaim_debug_info("msn", |
12318
e346a085bb4f
[gaim-migrate @ 14622]
Richard Laager <rlaager@wiktel.com>
parents:
11638
diff
changeset
|
340 "%s has removed you from his or her buddy list.\n", |
9193 | 341 passport); |
11039
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
342 |
11338 | 343 convo = gaim_find_conversation_with_account(GAIM_CONV_TYPE_IM, passport, account); |
11039
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
344 if (convo) { |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
345 GaimBuddy *buddy; |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
346 char *msg; |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
347 |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
348 buddy = gaim_find_buddy(account, passport); |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
349 msg = g_strdup_printf( |
12318
e346a085bb4f
[gaim-migrate @ 14622]
Richard Laager <rlaager@wiktel.com>
parents:
11638
diff
changeset
|
350 _("%s has removed you from his or her buddy list."), |
11039
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
351 buddy ? gaim_buddy_get_contact_alias(buddy) : passport); |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
352 gaim_conv_im_write(GAIM_CONV_IM(convo), passport, msg, |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
353 GAIM_MESSAGE_SYSTEM, time(NULL)); |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
354 g_free(msg); |
34d2aac7b34f
[gaim-migrate @ 12938]
Richard Laager <rlaager@wiktel.com>
parents:
10774
diff
changeset
|
355 } |
9193 | 356 } |
357 | |
358 user->list_op &= ~(1 << list_id); | |
359 /* gaim_user_remove_list_id (user, list_id); */ | |
360 | |
361 if (user->list_op == 0) | |
362 { | |
363 gaim_debug_info("msn", "Buddy '%s' shall be deleted?.\n", | |
364 passport); | |
365 | |
366 } | |
367 } | |
368 | |
369 void | |
370 msn_got_lst_user(MsnSession *session, MsnUser *user, | |
371 int list_op, GSList *group_ids) | |
372 { | |
373 GaimConnection *gc; | |
374 GaimAccount *account; | |
375 const char *passport; | |
376 const char *store; | |
377 | |
378 account = session->account; | |
379 gc = gaim_account_get_connection(account); | |
380 | |
381 passport = msn_user_get_passport(user); | |
9211
74c81f56b0a5
[gaim-migrate @ 10006]
Christian Hammond <chipx86@chipx86.com>
parents:
9210
diff
changeset
|
382 store = msn_user_get_store_name(user); |
9193 | 383 |
384 if (list_op & MSN_LIST_FL_OP) | |
385 { | |
386 GSList *c; | |
387 for (c = group_ids; c != NULL; c = g_slist_next(c)) | |
388 { | |
389 int group_id; | |
390 group_id = GPOINTER_TO_INT(c->data); | |
391 msn_user_add_group_id(user, group_id); | |
392 } | |
393 | |
394 /* FIXME: It might be a real alias */ | |
395 /* serv_got_alias(gc, passport, store); */ | |
396 } | |
397 | |
398 if (list_op & MSN_LIST_AL_OP) | |
399 { | |
400 /* These are users who are allowed to see our status. */ | |
401 | |
402 if (g_slist_find_custom(account->deny, passport, | |
403 (GCompareFunc)strcmp)) | |
404 { | |
405 gaim_privacy_deny_remove(gc->account, passport, TRUE); | |
406 } | |
407 | |
408 gaim_privacy_permit_add(account, passport, TRUE); | |
409 } | |
410 | |
411 if (list_op & MSN_LIST_BL_OP) | |
412 { | |
413 /* These are users who are not allowed to see our status. */ | |
414 | |
415 if (g_slist_find_custom(account->permit, passport, | |
416 (GCompareFunc)strcmp)) | |
417 { | |
418 gaim_privacy_permit_remove(gc->account, passport, TRUE); | |
419 } | |
420 | |
421 gaim_privacy_deny_add(account, passport, TRUE); | |
422 } | |
423 | |
424 if (list_op & MSN_LIST_RL_OP) | |
425 { | |
12318
e346a085bb4f
[gaim-migrate @ 14622]
Richard Laager <rlaager@wiktel.com>
parents:
11638
diff
changeset
|
426 /* These are users who have us on their buddy list. */ |
9193 | 427 /* TODO: what does store name is when this happens? */ |
428 | |
10583 | 429 if (!(list_op & (MSN_LIST_AL_OP | MSN_LIST_BL_OP))) |
9225
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
430 { |
9193 | 431 got_new_entry(gc, passport, store); |
9225
554ef91db2dd
[gaim-migrate @ 10021]
Christian Hammond <chipx86@chipx86.com>
parents:
9223
diff
changeset
|
432 } |
9193 | 433 } |
434 | |
435 user->list_op = list_op; | |
436 } | |
437 | |
438 /************************************************************************** | |
439 * UserList functions | |
440 **************************************************************************/ | |
441 | |
442 MsnUserList* | |
443 msn_userlist_new(MsnSession *session) | |
444 { | |
445 MsnUserList *userlist; | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
446 |
9193 | 447 userlist = g_new0(MsnUserList, 1); |
448 | |
449 userlist->session = session; | |
9860 | 450 userlist->buddy_icon_requests = g_queue_new(); |
451 userlist->buddy_icon_window = 5; | |
9193 | 452 |
453 return userlist; | |
454 } | |
455 | |
456 void | |
457 msn_userlist_destroy(MsnUserList *userlist) | |
458 { | |
459 GList *l; | |
460 | |
461 for (l = userlist->users; l != NULL; l = l->next) | |
462 { | |
463 msn_user_destroy(l->data); | |
464 } | |
465 | |
466 g_list_free(userlist->users); | |
467 | |
468 for (l = userlist->groups; l != NULL; l = l->next) | |
469 { | |
470 msn_group_destroy(l->data); | |
471 } | |
472 | |
473 g_list_free(userlist->groups); | |
9895 | 474 |
475 g_queue_free(userlist->buddy_icon_requests); | |
9857 | 476 g_free(userlist); |
9193 | 477 } |
478 | |
479 void | |
480 msn_userlist_add_user(MsnUserList *userlist, MsnUser *user) | |
481 { | |
482 userlist->users = g_list_append(userlist->users, user); | |
483 } | |
484 | |
485 void | |
486 msn_userlist_remove_user(MsnUserList *userlist, MsnUser *user) | |
487 { | |
488 userlist->users = g_list_remove(userlist->users, user); | |
489 } | |
490 | |
491 MsnUser * | |
492 msn_userlist_find_user(MsnUserList *userlist, const char *passport) | |
493 { | |
494 GList *l; | |
495 | |
496 g_return_val_if_fail(passport != NULL, NULL); | |
497 | |
498 for (l = userlist->users; l != NULL; l = l->next) | |
499 { | |
500 MsnUser *user = (MsnUser *)l->data; | |
501 | |
502 g_return_val_if_fail(user->passport != NULL, NULL); | |
503 | |
504 if (!strcmp(passport, user->passport)) | |
505 return user; | |
506 } | |
507 | |
508 return NULL; | |
509 } | |
510 | |
511 void | |
512 msn_userlist_add_group(MsnUserList *userlist, MsnGroup *group) | |
513 { | |
514 userlist->groups = g_list_append(userlist->groups, group); | |
515 } | |
516 | |
517 void | |
518 msn_userlist_remove_group(MsnUserList *userlist, MsnGroup *group) | |
519 { | |
520 userlist->groups = g_list_remove(userlist->groups, group); | |
521 } | |
522 | |
523 MsnGroup * | |
524 msn_userlist_find_group_with_id(MsnUserList *userlist, int id) | |
525 { | |
526 GList *l; | |
527 | |
528 g_return_val_if_fail(userlist != NULL, NULL); | |
529 g_return_val_if_fail(id >= 0, NULL); | |
530 | |
531 for (l = userlist->groups; l != NULL; l = l->next) | |
532 { | |
533 MsnGroup *group = l->data; | |
534 | |
535 if (group->id == id) | |
536 return group; | |
537 } | |
538 | |
539 return NULL; | |
540 } | |
541 | |
542 MsnGroup * | |
543 msn_userlist_find_group_with_name(MsnUserList *userlist, const char *name) | |
544 { | |
545 GList *l; | |
546 | |
547 g_return_val_if_fail(userlist != NULL, NULL); | |
548 g_return_val_if_fail(name != NULL, NULL); | |
549 | |
550 for (l = userlist->groups; l != NULL; l = l->next) | |
551 { | |
552 MsnGroup *group = l->data; | |
553 | |
554 if ((group->name != NULL) && !g_ascii_strcasecmp(name, group->name)) | |
555 return group; | |
556 } | |
557 | |
558 return NULL; | |
559 } | |
560 | |
561 int | |
562 msn_userlist_find_group_id(MsnUserList *userlist, const char *group_name) | |
563 { | |
564 MsnGroup *group; | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
565 |
9193 | 566 group = msn_userlist_find_group_with_name(userlist, group_name); |
567 | |
568 if (group != NULL) | |
569 return msn_group_get_id(group); | |
570 else | |
571 return -1; | |
572 } | |
573 | |
574 const char * | |
575 msn_userlist_find_group_name(MsnUserList *userlist, int group_id) | |
576 { | |
577 MsnGroup *group; | |
9198
ab6636c5a136
[gaim-migrate @ 9993]
Christian Hammond <chipx86@chipx86.com>
parents:
9197
diff
changeset
|
578 |
9193 | 579 group = msn_userlist_find_group_with_id(userlist, group_id); |
580 | |
581 if (group != NULL) | |
582 return msn_group_get_name(group); | |
583 else | |
584 return NULL; | |
585 } | |
586 | |
587 void | |
588 msn_userlist_rename_group_id(MsnUserList *userlist, int group_id, | |
589 const char *new_name) | |
590 { | |
591 MsnGroup *group; | |
592 | |
593 group = msn_userlist_find_group_with_id(userlist, group_id); | |
594 | |
595 if (group != NULL) | |
596 msn_group_set_name(group, new_name); | |
597 } | |
598 | |
599 void | |
600 msn_userlist_remove_group_id(MsnUserList *userlist, int group_id) | |
601 { | |
602 MsnGroup *group; | |
603 | |
604 group = msn_userlist_find_group_with_id(userlist, group_id); | |
605 | |
606 if (group != NULL) | |
10533 | 607 { |
9193 | 608 msn_userlist_remove_group(userlist, group); |
10533 | 609 msn_group_destroy(group); |
610 } | |
9193 | 611 } |
612 | |
613 void | |
614 msn_userlist_rem_buddy(MsnUserList *userlist, | |
615 const char *who, int list_id, const char *group_name) | |
616 { | |
617 MsnUser *user; | |
618 int group_id; | |
619 const char *list; | |
620 | |
621 user = msn_userlist_find_user(userlist, who); | |
622 group_id = -1; | |
623 | |
624 if (group_name != NULL) | |
625 { | |
626 group_id = msn_userlist_find_group_id(userlist, group_name); | |
627 | |
628 if (group_id < 0) | |
629 { | |
630 /* Whoa, there is no such group. */ | |
631 gaim_debug_error("msn", "Group doesn't exist: %s\n", group_name); | |
632 return; | |
633 } | |
634 } | |
635 | |
636 /* First we're going to check if not there. */ | |
637 if (!(user_is_there(user, list_id, group_id))) | |
638 { | |
639 list = lists[list_id]; | |
640 gaim_debug_error("msn", "User '%s' is not there: %s\n", | |
641 who, list); | |
642 return; | |
643 } | |
644 | |
645 /* Then request the rem to the server. */ | |
646 list = lists[list_id]; | |
647 | |
648 msn_notification_rem_buddy(userlist->session->notification, list, who, group_id); | |
649 } | |
650 | |
651 void | |
652 msn_userlist_add_buddy(MsnUserList *userlist, | |
653 const char *who, int list_id, | |
654 const char *group_name) | |
655 { | |
656 MsnUser *user; | |
657 int group_id; | |
658 const char *list; | |
659 const char *store_name; | |
9194
364aa73323b5
[gaim-migrate @ 9989]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
660 |
9193 | 661 group_id = -1; |
662 | |
11057
e9eeacd1a8d0
[gaim-migrate @ 13009]
Richard Laager <rlaager@wiktel.com>
parents:
11039
diff
changeset
|
663 if (!gaim_email_is_valid(who)) |
e9eeacd1a8d0
[gaim-migrate @ 13009]
Richard Laager <rlaager@wiktel.com>
parents:
11039
diff
changeset
|
664 { |
11638 | 665 /* only notify the user about problems adding to the friends list |
666 * maybe we should do something else for other lists, but it probably | |
667 * won't cause too many problems if we just ignore it */ | |
668 if (list_id == MSN_LIST_FL) | |
669 { | |
670 char *str = g_strdup_printf(_("Unable to add \"%s\"."), who); | |
671 gaim_notify_error(NULL, NULL, str, | |
672 _("The screen name specified is invalid.")); | |
673 g_free(str); | |
674 } | |
675 | |
11057
e9eeacd1a8d0
[gaim-migrate @ 13009]
Richard Laager <rlaager@wiktel.com>
parents:
11039
diff
changeset
|
676 return; |
e9eeacd1a8d0
[gaim-migrate @ 13009]
Richard Laager <rlaager@wiktel.com>
parents:
11039
diff
changeset
|
677 } |
e9eeacd1a8d0
[gaim-migrate @ 13009]
Richard Laager <rlaager@wiktel.com>
parents:
11039
diff
changeset
|
678 |
9193 | 679 if (group_name != NULL) |
680 { | |
681 group_id = msn_userlist_find_group_id(userlist, group_name); | |
682 | |
683 if (group_id < 0) | |
684 { | |
685 /* Whoa, we must add that group first. */ | |
686 msn_request_add_group(userlist, who, NULL, group_name); | |
687 return; | |
688 } | |
689 } | |
690 | |
691 user = msn_userlist_find_user(userlist, who); | |
692 | |
9194
364aa73323b5
[gaim-migrate @ 9989]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
693 /* First we're going to check if it's already there. */ |
9193 | 694 if (user_is_there(user, list_id, group_id)) |
695 { | |
696 list = lists[list_id]; | |
9194
364aa73323b5
[gaim-migrate @ 9989]
Christian Hammond <chipx86@chipx86.com>
parents:
9193
diff
changeset
|
697 gaim_debug_error("msn", "User '%s' is already there: %s\n", who, list); |
9193 | 698 return; |
699 } | |
700 | |
701 store_name = (user != NULL) ? get_store_name(user) : who; | |
702 | |
703 /* Then request the add to the server. */ | |
704 list = lists[list_id]; | |
705 | |
706 msn_notification_add_buddy(userlist->session->notification, list, who, | |
707 store_name, group_id); | |
708 } | |
709 | |
710 void | |
711 msn_userlist_move_buddy(MsnUserList *userlist, const char *who, | |
712 const char *old_group_name, const char *new_group_name) | |
713 { | |
714 int new_group_id; | |
715 | |
716 new_group_id = msn_userlist_find_group_id(userlist, new_group_name); | |
717 | |
718 if (new_group_id < 0) | |
719 { | |
720 msn_request_add_group(userlist, who, old_group_name, new_group_name); | |
721 return; | |
722 } | |
723 | |
10568 | 724 msn_userlist_add_buddy(userlist, who, MSN_LIST_FL, new_group_name); |
9193 | 725 msn_userlist_rem_buddy(userlist, who, MSN_LIST_FL, old_group_name); |
726 } |