static gboolean should_hide_notice(PurpleConversation *conv, const char *name, GHashTable *users) { PurpleConvChat *chat; int threshold; struct joinpart_key key; time_t *last_said; g_return_val_if_fail(conv != NULL, FALSE); g_return_val_if_fail(purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_CHAT, FALSE); /* If the room is small, don't bother. */ chat = PURPLE_CONV_CHAT(conv); threshold = purple_prefs_get_int(THRESHOLD_PREF); if (g_list_length(purple_conv_chat_get_users(chat)) < threshold) return FALSE; if (!purple_prefs_get_bool(HIDE_BUDDIES_PREF) && purple_find_buddy(purple_conversation_get_account(conv), name)) return FALSE; /* Only show the notice if the user has spoken recently. */ key.conv = conv; key.user = (gchar *)name; last_said = g_hash_table_lookup(users, &key); if (last_said != NULL) { int delay = purple_prefs_get_int(DELAY_PREF); if (delay > 0 && (*last_said + (delay * 60)) >= time(NULL)) return FALSE; } return TRUE; }
static void yahoo_conf_invite(PurpleConnection *gc, PurpleConversation *c, const char *dn, const char *buddy, const char *room, const char *msg) { YahooData *yd = gc->proto_data; struct yahoo_packet *pkt; GList *members; char *msg2 = NULL; if (msg) msg2 = yahoo_string_encode(gc, msg, NULL); members = purple_conv_chat_get_users(PURPLE_CONV_CHAT(c)); pkt = yahoo_packet_new(YAHOO_SERVICE_CONFADDINVITE, YAHOO_STATUS_AVAILABLE, yd->session_id); yahoo_packet_hash(pkt, "sssss", 1, dn, 51, buddy, 57, room, 58, msg?msg2:"", 13, "0"); for(; members; members = members->next) { const char *name = purple_conv_chat_cb_get_name(members->data); if (!strcmp(name, dn)) continue; yahoo_packet_hash(pkt, "ss", 52, name, 53, name); } yahoo_packet_send_and_free(pkt, yd); g_free(msg2); }
int yahoo_c_send(PurpleConnection *gc, int id, const char *what, PurpleMessageFlags flags) { PurpleConversation *c; int ret; YahooData *yd; yd = (YahooData *) gc->proto_data; if (!yd) return -1; c = purple_find_chat(gc, id); if (!c) return -1; if (id != YAHOO_CHAT_ID) { ret = yahoo_conf_send(gc, purple_connection_get_display_name(gc), purple_conversation_get_name(c), purple_conv_chat_get_users(PURPLE_CONV_CHAT(c)), what); } else { ret = yahoo_chat_send(gc, purple_connection_get_display_name(gc), purple_conversation_get_name(c), what, flags); if (!ret) serv_got_chat_in(gc, purple_conv_chat_get_id(PURPLE_CONV_CHAT(c)), purple_connection_get_display_name(gc), flags, what, time(NULL)); } return ret; }
static PurpleCmdRet plonk_cmd_cb(PurpleConversation *c, const gchar *cmd, gchar **args, gchar **error, void *data) { /* this is the funky 'mass block/ignore' routine. * given a/n list of ID/'s it'll add that|those to all block|ignore lists * of each account of the same prpl type. */ /* * gchar* g_strdelimit (gchar *string, const gchar *delimiters, gchar new_delimiter); * gchar** g_strsplit (const gchar *string, const gchar *delimiter, gint max_tokens); */ PurpleConversationUiOps *ops; GSList *l; char *room = NULL; GList *plonks = NULL; GList *members = NULL; gchar **tmp; if(!args[0]) { purple_debug_info("Plonkers", "Bad arg: %s\n", args[0]); return PURPLE_CMD_RET_FAILED; } if(!g_utf8_validate(*args, -1, NULL)) { purple_debug_info("Plonkers", "Invalid UTF8: %s\n", args[0]); return PURPLE_CMD_RET_FAILED; } purple_debug_info("plonkers", "Plonk arg: %s\n", args[0]); g_strdelimit (*args, "_-|> <.,:;", ' '); purple_debug_info("plonkers", "Plonk delimited arg: %s\n", args[0]); tmp = g_strsplit(args[0], " ", 0); purple_debug_info("plonkers", "Plonk strsplit length: %i\n", g_strv_length(tmp)); /* next step, remove duplicates in the array */ ops = purple_conversation_get_ui_ops(c); PurpleAccount *account = purple_conversation_get_account(c); members = purple_conv_chat_get_users(PURPLE_CONV_CHAT(c)); for (l = account->deny; l != NULL; l = l->next) { for (plonks = members; plonks; plonks = plonks->next) { if (!purple_utf8_strcasecmp((char *)l->data, plonks->data)) { purple_debug_info("plonkers", "Ignoring room member %s in room %s\n" ,(gchar *)plonks->data, room); /* purple_conv_chat_ignore(PURPLE_CONV_CHAT(c),plonks->data); * ops->chat_update_user((c), plonks->data); */ } } } g_list_free(plonks); g_list_free(members); g_strfreev(tmp); return PURPLE_CMD_RET_OK; }
void PurpleLine::chat_leave(int id) { PurpleConversation *conv = purple_find_chat(conn, id); if (!conv) return; PurpleConvChat *chat = PURPLE_CONV_CHAT(conv); for (GList *buddies = purple_conv_chat_get_users(chat); buddies; buddies = g_list_next(buddies)) { PurpleConvChatBuddy *buddy = (PurpleConvChatBuddy *)buddies->data; blist_remove_buddy(purple_conv_chat_cb_get_name(buddy), true, chat); } }
void yahoo_c_leave(PurpleConnection *gc, int id) { YahooData *yd = (YahooData *) gc->proto_data; PurpleConversation *c; if (!yd) return; c = purple_find_chat(gc, id); if (!c) return; if (id != YAHOO_CHAT_ID) { yahoo_conf_leave(yd, purple_conversation_get_name(c), purple_connection_get_display_name(gc), purple_conv_chat_get_users(PURPLE_CONV_CHAT(c))); yd->confs = g_slist_remove(yd->confs, c); } else { yahoo_chat_leave(gc, purple_conversation_get_name(c), purple_connection_get_display_name(gc), TRUE); } serv_got_chat_left(gc, id); }