Mercurial > pidgin
comparison src/server.c @ 6479:b808f9734879
[gaim-migrate @ 6992]
(19:12:00) Robot101: replacing some slightly crufty old code which makes assumptions like AIM-only, ignores gcs, could've messed up in certain obscure circumstances.
(19:12:10) Robot101: my code's probably more efficient in cpu and memory too.
(19:12:28) Robot101: and it's orthogonal to my message queue work so I split it off.
committer: Tailor Script <tailor@pidgin.im>
| author | Luke Schierer <lschiere@pidgin.im> |
|---|---|
| date | Fri, 15 Aug 2003 23:13:42 +0000 |
| parents | 338147ea6896 |
| children | 70d5122bc3ff |
comparison
equal
deleted
inserted
replaced
| 6478:338147ea6896 | 6479:b808f9734879 |
|---|---|
| 174 return prpl_info->send_typing(g, name, typing); | 174 return prpl_info->send_typing(g, name, typing); |
| 175 | 175 |
| 176 return 0; | 176 return 0; |
| 177 } | 177 } |
| 178 | 178 |
| 179 struct queued_away_response { | 179 GSList *last_auto_responses = NULL; |
| 180 struct last_auto_response { | |
| 181 GaimConnection *gc; | |
| 180 char name[80]; | 182 char name[80]; |
| 181 time_t sent_away; | 183 time_t sent; |
| 182 }; | 184 }; |
| 183 | 185 |
| 184 struct queued_away_response *find_queued_away_response_by_name(const char *name); | 186 gboolean expire_last_auto_responses(gpointer data) |
| 187 { | |
| 188 GSList *tmp, *cur; | |
| 189 struct last_auto_response *lar; | |
| 190 | |
| 191 tmp = last_auto_responses; | |
| 192 | |
| 193 while (tmp) { | |
| 194 cur = tmp; | |
| 195 tmp = tmp->next; | |
| 196 lar = (struct last_auto_response *)cur->data; | |
| 197 | |
| 198 if ((time(NULL) - lar->sent) > | |
| 199 gaim_prefs_get_int("/core/away/auto_response/sec_before_resend")) { | |
| 200 | |
| 201 last_auto_responses = g_slist_remove(last_auto_responses, lar); | |
| 202 g_free(lar); | |
| 203 } | |
| 204 } | |
| 205 | |
| 206 return FALSE; /* do not run again */ | |
| 207 } | |
| 208 | |
| 209 struct last_auto_response *get_last_auto_response(GaimConnection *gc, const char *name) | |
| 210 { | |
| 211 GSList *tmp; | |
| 212 struct last_auto_response *lar; | |
| 213 | |
| 214 /* because we're modifying or creating a lar, schedule the | |
| 215 * function to expire them as the pref dictates */ | |
| 216 g_timeout_add((gaim_prefs_get_int("/core/away/auto_response/sec_before_resend") + 1) * 1000, | |
| 217 expire_last_auto_responses, NULL); | |
| 218 | |
| 219 tmp = last_auto_responses; | |
| 220 | |
| 221 while (tmp) { | |
| 222 lar = (struct last_auto_response *)tmp->data; | |
| 223 | |
| 224 if (gc == lar->gc && !strncmp(name, lar->name, sizeof(lar->name))) | |
| 225 return lar; | |
| 226 | |
| 227 tmp = tmp->next; | |
| 228 } | |
| 229 | |
| 230 lar = (struct last_auto_response *)g_new0(struct last_auto_response, 1); | |
| 231 g_snprintf(lar->name, sizeof(lar->name), "%s", name); | |
| 232 lar->gc = gc; | |
| 233 lar->sent = 0; | |
| 234 last_auto_responses = g_slist_append(last_auto_responses, lar); | |
| 235 | |
| 236 return lar; | |
| 237 } | |
| 238 | |
| 239 void flush_last_auto_responses(GaimConnection *gc) | |
| 240 { | |
| 241 GSList *tmp, *cur; | |
| 242 struct last_auto_response *lar; | |
| 243 | |
| 244 tmp = last_auto_responses; | |
| 245 | |
| 246 while (tmp) { | |
| 247 cur = tmp; | |
| 248 tmp = tmp->next; | |
| 249 lar = (struct last_auto_response *)cur->data; | |
| 250 | |
| 251 if (lar->gc == gc) { | |
| 252 last_auto_responses = g_slist_remove(last_auto_responses, lar); | |
| 253 g_free(lar); | |
| 254 } | |
| 255 } | |
| 256 } | |
| 185 | 257 |
| 186 int serv_send_im(GaimConnection *gc, const char *name, const char *message, | 258 int serv_send_im(GaimConnection *gc, const char *name, const char *message, |
| 187 int len, int flags) | 259 int len, int flags) |
| 188 { | 260 { |
| 189 GaimConversation *c; | 261 GaimConversation *c; |
| 200 | 272 |
| 201 if (!(flags & IM_FLAG_AWAY)) | 273 if (!(flags & IM_FLAG_AWAY)) |
| 202 serv_touch_idle(gc); | 274 serv_touch_idle(gc); |
| 203 | 275 |
| 204 if (gc->away && | 276 if (gc->away && |
| 205 !gaim_prefs_get_bool("/core/away/auto_response/in_active_conv") && | 277 (gc->flags & OPT_CONN_AUTO_RESP) && |
| 206 gaim_prefs_get_bool("/core/away/auto_response/enabled")) { | 278 gaim_prefs_get_bool("/core/away/auto_response/enabled") && |
| 207 | 279 !gaim_prefs_get_bool("/core/away/auto_response/in_active_conv")) { |
| 208 time_t t; | 280 |
| 209 struct queued_away_response *qar; | 281 struct last_auto_response *lar; |
| 210 time(&t); | 282 lar = get_last_auto_response(gc, name); |
| 211 qar = find_queued_away_response_by_name(name); | 283 lar->sent = time(NULL); |
| 212 if (!qar) { | |
| 213 qar = (struct queued_away_response *)g_new0(struct queued_away_response, 1); | |
| 214 g_snprintf(qar->name, sizeof(qar->name), "%s", name); | |
| 215 qar->sent_away = 0; | |
| 216 away_time_queue = g_slist_append(away_time_queue, qar); | |
| 217 } | |
| 218 qar->sent_away = t; | |
| 219 } | 284 } |
| 220 | 285 |
| 221 if (c && gaim_im_get_type_again_timeout(GAIM_IM(c))) | 286 if (c && gaim_im_get_type_again_timeout(GAIM_IM(c))) |
| 222 gaim_im_stop_type_again_timeout(GAIM_IM(c)); | 287 gaim_im_stop_type_again_timeout(GAIM_IM(c)); |
| 223 | 288 |
| 322 } | 387 } |
| 323 | 388 |
| 324 gaim_event_broadcast(event_away, gc, state, message); | 389 gaim_event_broadcast(event_away, gc, state, message); |
| 325 | 390 |
| 326 } | 391 } |
| 392 | |
| 393 /* New away message... Clear out the record of sent autoresponses */ | |
| 394 flush_last_auto_responses(gc); | |
| 327 | 395 |
| 328 system_log(log_away, gc, NULL, OPT_LOG_BUDDY_AWAY | OPT_LOG_MY_SIGNON); | 396 system_log(log_away, gc, NULL, OPT_LOG_BUDDY_AWAY | OPT_LOG_MY_SIGNON); |
| 329 } | 397 } |
| 330 | 398 |
| 331 void serv_set_away_all(const char *message) | 399 void serv_set_away_all(const char *message) |
| 712 | 780 |
| 713 templist = templist->next; | 781 templist = templist->next; |
| 714 } | 782 } |
| 715 | 783 |
| 716 return i; | 784 return i; |
| 717 } | |
| 718 | |
| 719 struct queued_away_response *find_queued_away_response_by_name(const char *name) | |
| 720 { | |
| 721 GSList *templist; | |
| 722 struct queued_away_response *qar; | |
| 723 | |
| 724 templist = away_time_queue; | |
| 725 | |
| 726 while (templist) { | |
| 727 qar = (struct queued_away_response *)templist->data; | |
| 728 | |
| 729 if (!strcmp(name, qar->name)) | |
| 730 return qar; | |
| 731 | |
| 732 templist = templist->next; | |
| 733 } | |
| 734 | |
| 735 return NULL; | |
| 736 } | 785 } |
| 737 | 786 |
| 738 /* | 787 /* |
| 739 * woo. i'm actually going to comment this function. isn't that fun. make | 788 * woo. i'm actually going to comment this function. isn't that fun. make |
| 740 * sure to follow along, kids | 789 * sure to follow along, kids |
| 824 * we're not. If we're not, then it's easy. If we are, then there | 873 * we're not. If we're not, then it's easy. If we are, then there |
| 825 * are three or four different ways of handling it and different | 874 * are three or four different ways of handling it and different |
| 826 * things we have to do for each. | 875 * things we have to do for each. |
| 827 */ | 876 */ |
| 828 if (gc->away) { | 877 if (gc->away) { |
| 829 time_t t; | 878 time_t t = time(NULL); |
| 830 char *tmpmsg; | 879 char *tmpmsg; |
| 831 struct buddy *b = gaim_find_buddy(gc->account, name); | 880 struct buddy *b = gaim_find_buddy(gc->account, name); |
| 832 char *alias = b ? gaim_get_buddy_alias(b) : name; | 881 char *alias = b ? gaim_get_buddy_alias(b) : name; |
| 833 int row; | 882 int row; |
| 834 struct queued_away_response *qar; | 883 struct last_auto_response *lar; |
| 835 | |
| 836 time(&t); | |
| 837 | 884 |
| 838 /* | 885 /* |
| 839 * Either we're going to queue it or not. Because of the way | 886 * Either we're going to queue it or not. Because of the way |
| 840 * awayness currently works, this is fucked up. It's possible | 887 * awayness currently works, this is fucked up. It's possible |
| 841 * for an account to be away without the imaway dialog being | 888 * for an account to be away without the imaway dialog being |
| 928 * you went away, and someone sent you a message and got your | 975 * you went away, and someone sent you a message and got your |
| 929 * auto-response, and then you closed the window, and then the | 976 * auto-response, and then you closed the window, and then the |
| 930 * sent you another one, they'd get the auto-response back too | 977 * sent you another one, they'd get the auto-response back too |
| 931 * soon. Besides that, we need to keep track of this even if we've | 978 * soon. Besides that, we need to keep track of this even if we've |
| 932 * got a queue. So the rest of this block is just the auto-response, | 979 * got a queue. So the rest of this block is just the auto-response, |
| 933 * if necessary | 980 * if necessary. |
| 934 */ | 981 */ |
| 935 qar = find_queued_away_response_by_name(name); | 982 lar = get_last_auto_response(gc, name); |
| 936 if (!qar) { | 983 if ((t - lar->sent) < |
| 937 qar = (struct queued_away_response *)g_new0(struct queued_away_response, 1); | |
| 938 g_snprintf(qar->name, sizeof(qar->name), "%s", name); | |
| 939 qar->sent_away = 0; | |
| 940 away_time_queue = g_slist_append(away_time_queue, qar); | |
| 941 } | |
| 942 if ((t - qar->sent_away) < | |
| 943 gaim_prefs_get_int("/core/away/auto_response/sec_before_resend")) { | 984 gaim_prefs_get_int("/core/away/auto_response/sec_before_resend")) { |
| 944 | 985 |
| 945 g_free(name); | 986 g_free(name); |
| 946 g_free(message); | 987 g_free(message); |
| 947 return; | 988 return; |
| 948 } | 989 } |
| 949 qar->sent_away = t; | 990 lar->sent = t; |
| 950 | 991 |
| 951 /* apply default fonts and colors */ | 992 /* apply default fonts and colors */ |
| 952 tmpmsg = stylize(gc->away, MSG_LEN); | 993 tmpmsg = stylize(gc->away, MSG_LEN); |
| 953 serv_send_im(gc, name, away_subs(tmpmsg, alias), -1, IM_FLAG_AWAY); | 994 serv_send_im(gc, name, away_subs(tmpmsg, alias), -1, IM_FLAG_AWAY); |
| 954 if (!cnv && awayqueue && | 995 if (!cnv && awayqueue && |
