static void ggp_chat_left(ggp_chat_local_info *chat, uin_t uin) { uin_t me; int idx = ggp_chat_participant_find(chat, uin); if (idx < 0) { purple_debug_warning("gg", "ggp_chat_joined: " "user %u isn't present in chat %" G_GUINT64_FORMAT "\n", uin, chat->id); return; } chat->participants[idx] = chat->participants[chat->participants_count - 1]; chat->participants_count--; chat->participants = g_realloc(chat->participants, sizeof(uin) * chat->participants_count); if (chat->conv == NULL) return; me = ggp_str_to_uin(purple_account_get_username( purple_connection_get_account(chat->gc))); if (me == uin) { purple_conversation_write_system_message( PURPLE_CONVERSATION(chat->conv), _("You have left the chat"), 0); purple_serv_got_chat_left(chat->gc, chat->local_id); chat->conv = NULL; chat->left = TRUE; } purple_chat_conversation_remove_user(chat->conv, ggp_uin_to_str(uin), NULL); }
void yahoo_c_leave(PurpleConnection *gc, int id) { YahooData *yd = purple_connection_get_protocol_data(gc); PurpleChatConversation *c; if (!yd) return; c = purple_conversations_find_chat(gc, id); if (!c) return; if (id != YAHOO_CHAT_ID) { GList *users; users = purple_chat_conversation_get_users(c); yahoo_conf_leave(yd, purple_conversation_get_name(PURPLE_CONVERSATION(c)), purple_connection_get_display_name(gc), users); g_list_free(users); yd->confs = g_slist_remove(yd->confs, c); } else { yahoo_chat_leave(gc, purple_conversation_get_name(PURPLE_CONVERSATION(c)), purple_connection_get_display_name(gc), TRUE); } purple_serv_got_chat_left(gc, id); }
static void ycht_process_chatjoin(YchtConn *ycht, YchtPkt *pkt) { char *room, *topic; PurpleConnection *gc = ycht->gc; PurpleChatConversation *c = NULL; gboolean new_room = FALSE; char **members; int i; room = g_list_nth_data(pkt->data, 0); topic = g_list_nth_data(pkt->data, 1); if (!g_list_nth_data(pkt->data, 4)) return; if (!room) return; members = g_strsplit(g_list_nth_data(pkt->data, 4), "\001", 0); for (i = 0; members[i]; i++) { char *tmp = strchr(members[i], '\002'); if (tmp) *tmp = '\0'; } if (g_list_length(pkt->data) > 5) new_room = TRUE; if (new_room && ycht->changing_rooms) { purple_serv_got_chat_left(gc, YAHOO_CHAT_ID); ycht->changing_rooms = FALSE; c = purple_serv_got_joined_chat(gc, YAHOO_CHAT_ID, room); } else { c = purple_conversations_find_chat(gc, YAHOO_CHAT_ID); } if (topic) purple_chat_conversation_set_topic(c, NULL, topic); for (i = 0; members[i]; i++) { if (new_room) { /*if (!strcmp(members[i], purple_connection_get_display_name(ycht->gc))) continue;*/ purple_chat_conversation_add_user(c, members[i], NULL, PURPLE_CHAT_USER_NONE, TRUE); } else { yahoo_chat_add_user(c, members[i], NULL); } } g_strfreev(members); }
static void yahoo_chat_leave(PurpleConnection *gc, const char *room, const char *dn, gboolean logout) { YahooData *yd = purple_connection_get_protocol_data(gc); struct yahoo_packet *pkt; char *eroom; if (yd->wm) { g_return_if_fail(yd->ycht != NULL); ycht_chat_leave(yd->ycht, room, logout); return; } eroom = yahoo_string_encode(gc, room, TRUE); pkt = yahoo_packet_new(YAHOO_SERVICE_CHATEXIT, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "sss", 104, eroom, 109, dn, 108, "1"); yahoo_packet_hash_str(pkt, 112, "0"); /* what does this one mean? */ yahoo_packet_send_and_free(pkt, yd); yd->in_chat = 0; if (yd->chat_name) { g_free(yd->chat_name); yd->chat_name = NULL; } if (purple_conversations_find_chat(gc, YAHOO_CHAT_ID) != NULL) purple_serv_got_chat_left(gc, YAHOO_CHAT_ID); if (!logout) return; pkt = yahoo_packet_new(YAHOO_SERVICE_CHATLOGOUT, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash_str(pkt, 1, dn); yahoo_packet_send_and_free(pkt, yd); yd->chat_online = FALSE; g_free(yd->pending_chat_room); yd->pending_chat_room = NULL; g_free(yd->pending_chat_id); yd->pending_chat_id = NULL; g_free(yd->pending_chat_topic); yd->pending_chat_topic = NULL; g_free(yd->pending_chat_goto); yd->pending_chat_goto = NULL; g_free(eroom); }