static void purplemot_chat_invite(PurpleConnection *gc, int id, const char *message, const char *who) { const char *username = gc->account->username; PurpleConversation *conv = purple_find_chat(gc, id); const char *room = conv->name; PurpleAccount *to_acct = purple_accounts_find(who, PURPLEMOT_ID); purple_debug_info("purplemot", "%s is inviting %s to join chat room %s\n", username, who, room); if (to_acct) { PurpleConversation *to_conv = purple_find_chat(to_acct->gc, id); if (to_conv) { char *tmp = g_strdup_printf("%s is already in chat room %s.", who, room); purple_debug_info("purplemot", "%s is already in chat room %s; " "ignoring invitation from %s\n", who, room, username); purple_notify_info(gc, _("Chat invitation"), _("Chat invitation"), tmp); g_free(tmp); } else { GHashTable *components; components = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free); g_hash_table_replace(components, "room", g_strdup(room)); g_hash_table_replace(components, "invited_by", g_strdup(username)); serv_got_chat_invite(to_acct->gc, room, username, message, components); } } }
void yahoo_process_conference_invite(GaimConnection *gc, struct yahoo_packet *pkt) { GSList *l; char *room = NULL; char *who = NULL; char *msg = NULL; GString *members = NULL; GHashTable *components; if (pkt->status == 2) return; /* XXX */ members = g_string_sized_new(512); for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 1: /* us, but we already know who we are */ break; case 57: room = pair->value; break; case 50: /* inviter */ who = pair->value; g_string_append_printf(members, "%s\n", who); break; case 52: /* members */ g_string_append_printf(members, "%s\n", pair->value); break; case 58: msg = pair->value; break; case 13: /* ? */ break; } } if (!room) { g_string_free(members, TRUE); return; } components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); g_hash_table_replace(components, g_strdup("room"), g_strdup(room)); if (msg) g_hash_table_replace(components, g_strdup("topic"), g_strdup(msg)); g_hash_table_replace(components, g_strdup("type"), g_strdup("Conference")); if (members) { g_hash_table_replace(components, g_strdup("members"), g_strdup(members->str)); } serv_got_chat_invite(gc, room, who, msg, components); g_string_free(members, TRUE); }
void yahoo_process_chat_addinvite(PurpleConnection *gc, struct yahoo_packet *pkt) { PurpleAccount *account; GSList *l; char *room = NULL; char *msg = NULL; char *who = NULL; account = purple_connection_get_account(gc); for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 104: g_free(room); room = yahoo_string_decode(gc, pair->value, TRUE); break; case 129: /* room id? */ break; case 126: /* ??? */ break; case 117: g_free(msg); msg = yahoo_string_decode(gc, pair->value, FALSE); break; case 119: who = pair->value; break; case 118: /* us */ break; } } if (room && who) { GHashTable *components; if (!purple_privacy_check(account, who) || (purple_account_get_bool(account, "ignore_invites", FALSE))) { purple_debug_info("yahoo", "Invite to room %s from %s has been dropped.\n", room, who); g_free(room); g_free(msg); return; } components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); g_hash_table_replace(components, g_strdup("room"), g_strdup(room)); serv_got_chat_invite(gc, room, who, msg, components); } g_free(room); g_free(msg); }
/*------------------------------------------------------------------------ * Received a Subscription Request to a MultiMX room. * * @param session The MXit session object * @param contact The invited MultiMX room's contact information * @param creator The nickname of the room's creator / invitor */ void multimx_invite(struct MXitSession* session, struct contact* contact, const char* creator) { GHashTable *components; struct multimx* multimx = NULL; purple_debug_info(MXIT_PLUGIN_ID, "Groupchat invite to '%s' by '%s'\n", contact->alias, creator); /* Create a new room */ multimx = room_create(session, contact->username, contact->alias, STATE_INVITED); components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); g_hash_table_insert(components, g_strdup("room"), g_strdup(contact->alias)); /* Call libpurple - will trigger either 'mxit_chat_join' or 'mxit_chat_reject' */ serv_got_chat_invite(session->con, contact->alias, creator, NULL, components); }
void PurpleLine::handle_group_invite( line::Group &group, line::Contact &invitee, line::Contact &inviter) { blist_update_buddy(invitee, true); if (invitee.mid == profile.mid) { // Current user was invited - show popup GHashTable *components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); g_hash_table_insert(components, g_strdup("type"), g_strdup(chat_type_to_string[ChatType::GROUP_INVITE].c_str())); g_hash_table_insert(components, g_strdup("id"), g_strdup(group.id.c_str())); // Invites on initial sync do not have inviter data std::string who = (inviter.__isset.mid) ? inviter.displayName : std::string("A member"); serv_got_chat_invite( conn, group.name.c_str(), who.c_str(), nullptr, components); } else { // Another user was invited - if a chat is open, add the user PurpleConversation *conv = purple_find_conversation_with_account( PURPLE_CONV_TYPE_CHAT, group.id.c_str(), acct); if (conv) { std::string msg = "Invited by " + inviter.displayName; purple_conv_chat_add_user( PURPLE_CONV_CHAT(conv), invitee.mid.c_str(), msg.c_str(), PURPLE_CBFLAGS_AWAY, TRUE); } } }
void irc_msg_invite(struct irc_conn *irc, const char *name, const char *from, char **args) { PurpleConnection *gc = purple_account_get_connection(irc->account); GHashTable *components; gchar *nick; if (!args || !args[1] || !gc) return; components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); nick = irc_mask_nick(from); g_hash_table_insert(components, g_strdup("channel"), g_strdup(args[1])); serv_got_chat_invite(gc, args[1], nick, NULL, components); g_free(nick); }
void yahoo_process_chat_addinvite(GaimConnection *gc, struct yahoo_packet *pkt) { GSList *l; char *room = NULL; char *msg = NULL; char *who = NULL; for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 104: room = pair->value; break; case 129: /* room id? */ break; case 126: /* ??? */ break; case 117: msg = pair->value; break; case 119: who = pair->value; break; case 118: /* us */ break; } } if (room && who) { GHashTable *components; components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); g_hash_table_replace(components, g_strdup("room"), g_strdup(room)); serv_got_chat_invite(gc, room, who, msg, components); } }
void yahoo_process_conference_invite(GaimConnection *gc, struct yahoo_packet *pkt) { GSList *l; char *room = NULL; char *who = NULL; char *msg = NULL; GString *members = NULL; GHashTable *components; if (pkt->status == 2) return; /* XXX */ members = g_string_sized_new(512); for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 1: /* us, but we already know who we are */ break; case 57: room = yahoo_string_decode(gc, pair->value, FALSE); break; case 50: /* inviter */ who = pair->value; g_string_append_printf(members, "%s\n", who); break; case 52: /* invitee (me) */ case 53: /* members */ g_string_append_printf(members, "%s\n", pair->value); break; case 58: msg = yahoo_string_decode(gc, pair->value, FALSE); break; case 13: /* ? */ break; } } if (!room) { g_string_free(members, TRUE); return; } components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); g_hash_table_replace(components, g_strdup("room"), room); if (msg) g_hash_table_replace(components, g_strdup("topic"), msg); g_hash_table_replace(components, g_strdup("type"), g_strdup("Conference")); if (members) { g_hash_table_replace(components, g_strdup("members"), g_strdup(members->str)); } if (!yahoo_privacy_check(gc, who) || (gaim_account_get_bool(gaim_connection_get_account(gc), "ignore_invites", FALSE))) { gaim_debug_info("yahoo", "Invite to conference %s from %s has been dropped.\n", room, who); g_string_free(members, TRUE); return; } serv_got_chat_invite(gc, room, who, msg, components); g_string_free(members, TRUE); }
void gfire_chat_proto_invite(gfire_data *p_gfire, guint16 p_packet_len) { if(!p_gfire) return; guint32 offset = XFIRE_HEADER_LEN; guint8 *chat_id = NULL; guint32 unknown = 0; guint32 userid = 0; gchar *name = NULL; gchar *nick = NULL; gchar *room = NULL; GHashTable *components = NULL; offset = gfire_proto_read_attr_chatid_bs(p_gfire->buff_in, &chat_id, 0x04, offset); if(offset == -1 || !chat_id) return; offset = gfire_proto_read_attr_int32_bs(p_gfire->buff_in, &unknown, 0xAA, offset); if(offset == -1) { g_free(chat_id); return; } offset = gfire_proto_read_attr_int32_bs(p_gfire->buff_in, &userid, 0x01, offset); if(offset == -1) { g_free(chat_id); return; } offset = gfire_proto_read_attr_string_bs(p_gfire->buff_in, &name, 0x02, offset); if(offset == -1 || !name) { g_free(chat_id); return; } offset = gfire_proto_read_attr_string_bs(p_gfire->buff_in, &nick, 0x0D, offset); if(offset == -1 || !nick) { g_free(chat_id); g_free(name); return; } offset = gfire_proto_read_attr_string_bs(p_gfire->buff_in, &room, 0x05, offset); if(offset == -1 || !room) { g_free(chat_id); g_free(name); g_free(nick); return; } if(strlen(nick) == 0) { g_free(nick); nick = g_strdup(name); } purple_debug(PURPLE_DEBUG_MISC, "gfire", "(chat invite): %s with alias %s invited us to room '%s'\n", NN(name), NN(nick), NN(room)); // assemble ghashtable components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); g_hash_table_replace(components, g_strdup("room"), room); g_hash_table_replace(components, g_strdup("chat_id"), purple_base64_encode(chat_id, XFIRE_CHATID_LEN)); g_free(chat_id); serv_got_chat_invite(gfire_get_connection(p_gfire), room, nick, "", components); }
void yahoo_process_conference_invite(PurpleConnection *gc, struct yahoo_packet *pkt) { PurpleAccount *account; GSList *l; char *room = NULL; char *who = NULL; char *msg = NULL; GString *members = NULL; GHashTable *components; if ( (pkt->status == 2) || (pkt->status == 11) ) return; /* Status is 11 when we are being notified about invitation being sent to someone else */ account = purple_connection_get_account(gc); for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; if (pair->key == 57) { room = yahoo_string_decode(gc, pair->value, FALSE); if (yahoo_find_conference(gc, room) != NULL) { /* Looks like we got invited to an already open conference. */ /* Laters: Should we accept this conference rather than ignoring the invitation ? */ purple_debug_info("yahoo","Ignoring invitation for an already existing chat, room:%s\n",room); g_free(room); return; } } } members = g_string_sized_new(512); for (l = pkt->hash; l; l = l->next) { struct yahoo_pair *pair = l->data; switch (pair->key) { case 1: /* us, but we already know who we are */ break; case 57: g_free(room); room = yahoo_string_decode(gc, pair->value, FALSE); break; case 50: /* inviter */ who = pair->value; g_string_append_printf(members, "%s\n", who); break; case 51: /* This user is being invited to the conference. Comes with status = 11, so we wont reach here */ break; case 52: /* Invited users. Assuming us invited, since we got this packet */ break; /* break needed, or else we add the users to the conference before they accept the invitation */ case 53: /* members who have already joined the conference */ g_string_append_printf(members, "%s\n", pair->value); break; case 58: g_free(msg); msg = yahoo_string_decode(gc, pair->value, FALSE); break; case 13: /* ? */ break; } } if (!room) { g_string_free(members, TRUE); g_free(msg); return; } if (!purple_privacy_check(account, who) || (purple_account_get_bool(account, "ignore_invites", FALSE))) { purple_debug_info("yahoo", "Invite to conference %s from %s has been dropped.\n", room, who); g_free(room); g_free(msg); g_string_free(members, TRUE); return; } components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); g_hash_table_replace(components, g_strdup("room"), room); if (msg) g_hash_table_replace(components, g_strdup("topic"), msg); g_hash_table_replace(components, g_strdup("type"), g_strdup("Conference")); g_hash_table_replace(components, g_strdup("members"), g_string_free(members, FALSE)); serv_got_chat_invite(gc, room, who, msg, components); }