Ticket #1244: history-since-last-message_3.4.1.patch
File history-since-last-message_3.4.1.patch, 2.7 KB (added by , at 2016-01-17T17:14:15Z) |
---|
-
protocols/jabber/conference.c
diff -ru bitlbee-3.4.1/protocols/jabber/conference.c bitlbee-3.4.1~/protocols/jabber/conference.c
old new 26 26 27 27 static xt_status jabber_chat_join_failed(struct im_connection *ic, struct xt_node *node, struct xt_node *orig); 28 28 29 void jabber_chat_update_last_message(struct groupchat *chat, time_t date) 30 { 31 char path[512]; 32 FILE *fp; 33 34 g_snprintf(path, sizeof(path) - 1, "%slast_message_%s_%s", global.conf->configdir, chat->ic->acc->tag, chat->title); 35 36 if ((fp = fopen(path, "w"))) { 37 fprintf(fp, "%ld", (long)date); 38 fclose(fp); 39 } 40 } 41 42 char *jabber_chat_get_last_message(struct groupchat *chat) 43 { 44 char path[512]; 45 char *buf = NULL; 46 time_t date; 47 FILE *fp; 48 49 g_snprintf(path, sizeof(path) - 1, "%slast_message_%s_%s", global.conf->configdir, chat->ic->acc->tag, chat->title); 50 51 if ((fp = fopen(path, "r"))) { 52 fscanf(fp, "%ld", &date); 53 /* receive messages starting one second after this date */ 54 date += 1; 55 buf = g_malloc(64); 56 strftime(buf, 63, "%Y-%m-%dT%H:%M:%SZ", gmtime(&date)); 57 fclose(fp); 58 } 59 60 return buf; 61 } 62 29 63 struct groupchat *jabber_chat_join(struct im_connection *ic, const char *room, const char *nick, const char *password) 30 64 { 31 65 struct jabber_chat *jc; 32 66 struct xt_node *node; 33 67 struct groupchat *c; 34 68 char *roomjid; 69 char *last_message_date; 70 71 c = imcb_chat_new(ic, room); 35 72 36 73 roomjid = g_strdup_printf("%s/%s", room, nick); 37 74 node = xt_new_node("x", NULL, NULL); … … 39 76 if (password) { 40 77 xt_add_child(node, xt_new_node("password", password, NULL)); 41 78 } 79 80 last_message_date = jabber_chat_get_last_message(c); 81 if (last_message_date) { 82 struct xt_node *history; 83 history = xt_new_node("history", NULL, NULL); 84 xt_add_attr(history, "since", last_message_date); 85 xt_add_child(node, history); 86 g_free(last_message_date); 87 } 88 42 89 node = jabber_make_packet("presence", NULL, roomjid, node); 43 90 jabber_cache_add(ic, node, jabber_chat_join_failed); 44 91 … … 61 108 of the nick to send a proper presence update. */ 62 109 jc->my_full_jid = roomjid; 63 110 64 c = imcb_chat_new(ic, room);65 111 c->data = jc; 66 112 67 113 return c; … … 359 405 char *nick = NULL; 360 406 char *final_from = NULL; 361 407 char *bare_jid = NULL; 408 time_t date; 362 409 363 410 from = (bud) ? bud->full_jid : xt_find_attr(node, "from"); 364 411 … … 433 480 } else { 434 481 final_from = nick; 435 482 } 436 437 imcb_chat_msg(chat, final_from, body->text, 0, jabber_get_timestamp(node)); 483 484 date = jabber_get_timestamp(node); 485 jabber_chat_update_last_message(chat, date); 486 imcb_chat_msg(chat, final_from, body->text, 0, date); 438 487 439 488 g_free(bare_jid); 440 489 }