/* {{{ Methods */ static int room_new(LuaState *L) { luaL_checktype(L, 1, LUA_TTABLE); const char *roomname = luaL_checkstring(L, 2); PurpleRoomlistRoom **room = ms_lua_newclass(L, "purple.room", sizeof(PurpleRoomlistRoom *)); *room = purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_ROOM, roomname, NULL); return 1; }
static void roomlist_disco_result_cb(JabberStream *js, const char *from, JabberIqType type, const char *id, xmlnode *packet, gpointer data) { xmlnode *query; xmlnode *item; if(!js->roomlist) return; if (type == JABBER_IQ_ERROR) { char *err = jabber_parse_error(js, packet, NULL); purple_notify_error(js->gc, _("Error"), _("Error retrieving room list"), err); purple_roomlist_set_in_progress(js->roomlist, FALSE); purple_roomlist_unref(js->roomlist); js->roomlist = NULL; g_free(err); return; } if(!(query = xmlnode_get_child(packet, "query"))) { char *err = jabber_parse_error(js, packet, NULL); purple_notify_error(js->gc, _("Error"), _("Error retrieving room list"), err); purple_roomlist_set_in_progress(js->roomlist, FALSE); purple_roomlist_unref(js->roomlist); js->roomlist = NULL; g_free(err); return; } for(item = xmlnode_get_child(query, "item"); item; item = xmlnode_get_next_twin(item)) { const char *name; PurpleRoomlistRoom *room; JabberID *jid; if(!(jid = jabber_id_new(xmlnode_get_attrib(item, "jid")))) continue; name = xmlnode_get_attrib(item, "name"); room = purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_ROOM, jid->node, NULL); purple_roomlist_room_add_field(js->roomlist, room, jid->node); purple_roomlist_room_add_field(js->roomlist, room, jid->domain); purple_roomlist_room_add_field(js->roomlist, room, name ? name : ""); purple_roomlist_room_add(js->roomlist, room); jabber_id_free(jid); } purple_roomlist_set_in_progress(js->roomlist, FALSE); purple_roomlist_unref(js->roomlist); js->roomlist = NULL; }
static void tgp_chat_roomlist_it (tgl_peer_t *P, void *extra) { connection_data *conn = extra; if (tgl_get_peer_type (P->id) == TGL_PEER_CHAT && P->chat.users_num) { char *id = g_strdup_printf ("%d", tgl_get_peer_id (P->id)); PurpleRoomlistRoom *room = purple_roomlist_room_new (PURPLE_ROOMLIST_ROOMTYPE_ROOM, P->chat.print_title, NULL); purple_roomlist_room_add_field (conn->roomlist, room, id); purple_roomlist_room_add_field (conn->roomlist, room, GINT_TO_POINTER(P->chat.users_num)); purple_roomlist_room_add (conn->roomlist, room); g_free (id); } }
static PurpleRoomlist * purplemot_roomlist_get_list(PurpleConnection *gc) { const char *username = gc->account->username; PurpleRoomlist *roomlist = purple_roomlist_new(gc->account); GList *fields = NULL; PurpleRoomlistField *field; GList *chats; GList *seen_ids = NULL; purple_debug_info("purplemot", "%s asks for room list; returning:\n", username); /* set up the room list */ field = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_STRING, "room", "room", TRUE /* hidden */); fields = g_list_append(fields, field); field = purple_roomlist_field_new(PURPLE_ROOMLIST_FIELD_INT, "Id", "Id", FALSE); fields = g_list_append(fields, field); purple_roomlist_set_fields(roomlist, fields); /* add each chat room. the chat ids are cached in seen_ids so that each room * is only returned once, even if multiple users are in it. */ for (chats = purple_get_chats(); chats; chats = g_list_next(chats)) { PurpleConversation *conv = (PurpleConversation *)chats->data; PurpleRoomlistRoom *room; const char *name = conv->name; int id = purple_conversation_get_chat_data(conv)->id; /* have we already added this room? */ if (g_list_find_custom(seen_ids, name, (GCompareFunc)strcmp)) continue; /* yes! try the next one. */ /* This cast is OK because this list is only staying around for the life * of this function and none of the conversations are being deleted * in that timespan. */ seen_ids = g_list_prepend(seen_ids, (char *)name); /* no, it's new. */ purple_debug_info("purplemot", "%s (%d), ", name, id); room = purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_ROOM, name, NULL); purple_roomlist_room_add_field(roomlist, room, name); purple_roomlist_room_add_field(roomlist, room, &id); purple_roomlist_room_add(roomlist, room); } g_list_free(seen_ids); purple_timeout_add(1 /* ms */, purplemot_finish_get_roomlist, roomlist); return roomlist; }
void irc_msg_list(struct irc_conn *irc, const char *name, const char *from, char **args) { if (!irc->roomlist) return; if (!strcmp(name, "321")) { purple_roomlist_set_in_progress(irc->roomlist, TRUE); return; } if (!strcmp(name, "323")) { purple_roomlist_set_in_progress(irc->roomlist, FALSE); purple_roomlist_unref(irc->roomlist); irc->roomlist = NULL; return; } if (!strcmp(name, "322")) { PurpleRoomlistRoom *room; char *topic; if (!args[0] || !args[1] || !args[2] || !args[3]) return; if (!purple_roomlist_get_in_progress(irc->roomlist)) { purple_debug_warning("irc", "Buggy server didn't send RPL_LISTSTART.\n"); purple_roomlist_set_in_progress(irc->roomlist, TRUE); } room = purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_ROOM, args[1], NULL); purple_roomlist_room_add_field(irc->roomlist, room, args[1]); purple_roomlist_room_add_field(irc->roomlist, room, GINT_TO_POINTER(strtol(args[2], NULL, 10))); topic = irc_mirc2txt(args[3]); purple_roomlist_room_add_field(irc->roomlist, room, topic); g_free(topic); purple_roomlist_room_add(irc->roomlist, room); } }
static void add_to_roomlist(qq_data *qd, qq_room_data *rmd) { PurpleRoomlistRoom *room; gchar field[11]; room = purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_ROOM, rmd->title_utf8, NULL); g_snprintf(field, sizeof(field), "%u", rmd->ext_id); purple_roomlist_room_add_field(qd->roomlist, room, field); g_snprintf(field, sizeof(field), "%u", rmd->creator_uid); purple_roomlist_room_add_field(qd->roomlist, room, field); purple_roomlist_room_add_field(qd->roomlist, room, rmd->desc_utf8); g_snprintf(field, sizeof(field), "%u", rmd->id); purple_roomlist_room_add_field(qd->roomlist, room, field); g_snprintf(field, sizeof(field), "%d", rmd->type8); purple_roomlist_room_add_field(qd->roomlist, room, field); g_snprintf(field, sizeof(field), "%d", rmd->auth_type); purple_roomlist_room_add_field(qd->roomlist, room, field); g_snprintf(field, sizeof(field), "%d", rmd->category); purple_roomlist_room_add_field(qd->roomlist, room, field); purple_roomlist_room_add_field(qd->roomlist, room, rmd->title_utf8); purple_roomlist_room_add(qd->roomlist, room); purple_roomlist_set_in_progress(qd->roomlist, FALSE); }
PurpleRoomlist * ggp_chat_roomlist_get_list(PurpleConnection *gc) { ggp_chat_session_data *sdata = ggp_chat_get_sdata(gc); PurpleRoomlist *roomlist; GList *fields = NULL; int i; purple_debug_info("gg", "ggp_chat_roomlist_get_list\n"); roomlist = purple_roomlist_new(purple_connection_get_account(gc)); fields = g_list_append(fields, purple_roomlist_field_new( PURPLE_ROOMLIST_FIELD_STRING, _("Conference identifier"), "id", TRUE)); fields = g_list_append(fields, purple_roomlist_field_new( PURPLE_ROOMLIST_FIELD_STRING, _("Start Date"), "date", FALSE)); fields = g_list_append(fields, purple_roomlist_field_new( PURPLE_ROOMLIST_FIELD_INT, _("User Count"), "users", FALSE)); fields = g_list_append(fields, purple_roomlist_field_new( PURPLE_ROOMLIST_FIELD_STRING, _("Status"), "status", FALSE)); purple_roomlist_set_fields(roomlist, fields); for (i = sdata->chats_count - 1; i >= 0 ; i--) { PurpleRoomlistRoom *room; ggp_chat_local_info *chat = &sdata->chats[i]; const gchar *name; time_t date; const gchar *status; int count = chat->participants_count; date = (uint32_t)(chat->id >> 32); if (chat->conv) status = _("Joined"); else if (chat->left) /* Translators: For Gadu-Gadu, this is one possible status for a chat room. It means you had previously joined the chat room but you have since left it. You cannot rejoin without another invitation. */ status = _("Chat left"); else { status = _("Can join chat"); count--; } name = ggp_chat_get_name_from_id(chat->id); room = purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_ROOM, name, NULL); purple_roomlist_room_add_field(roomlist, room, name); purple_roomlist_room_add_field(roomlist, room, purple_date_format_full(localtime(&date))); purple_roomlist_room_add_field(roomlist, room, GINT_TO_POINTER(count)); purple_roomlist_room_add_field(roomlist, room, status); purple_roomlist_room_add(roomlist, room); } /* TODO * purple_roomlist_set_in_progress(roomlist, FALSE); */ g_object_ref(roomlist); purple_timeout_add(1, ggp_chat_roomlist_get_list_finish, roomlist); return roomlist; }