Beispiel #1
0
void gaim_roomlist_room_join(GaimRoomlist *list, GaimRoomlistRoom *room)
{
	GHashTable *components;
	GList *l, *j;
	GaimConnection *gc;

	g_return_if_fail(list != NULL);
	g_return_if_fail(room != NULL);

	gc = gaim_account_get_connection(list->account);
	if (!gc)
		return;

	components = g_hash_table_new(g_str_hash, g_str_equal);

	g_hash_table_replace(components, "name", room->name);
	for (l = list->fields, j = room->fields; l && j; l = l->next, j = j->next) {
		GaimRoomlistField *f = l->data;

		g_hash_table_replace(components, f->name, j->data);
	}

	serv_join_chat(gc, components);

	g_hash_table_destroy(components);
}
Beispiel #2
0
void BuddyListChat::onActivate(Button& /*activator*/)
{
  PurpleAccount *account = purple_chat_get_account(chat);
  PurplePluginProtocolInfo *prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(
      purple_find_prpl(purple_account_get_protocol_id(account)));
  GHashTable *components = purple_chat_get_components(chat);

  char *chat_name = NULL;
  if (prpl_info && prpl_info->get_chat_name)
    chat_name = prpl_info->get_chat_name(components);

  const char *name;
  if (chat_name)
    name = chat_name;
  else
    name = purple_chat_get_name(chat);

  PurpleConversation *conv = purple_find_conversation_with_account(
      PURPLE_CONV_TYPE_CHAT, name, account);
  if (conv)
    purple_conversation_present(conv);

  serv_join_chat(purple_account_get_connection(account), components);

  g_free(chat_name);
}
Beispiel #3
0
struct groupchat *purple_chat_join(struct im_connection *ic, const char *room, const char *nick, const char *password,
                                   set_t **sets)
{
	struct purple_data *pd = ic->proto_data;
	PurplePlugin *prpl = purple_plugins_find_with_id(pd->account->protocol_id);
	PurplePluginProtocolInfo *pi = prpl->info->extra_info;
	GHashTable *chat_hash;
	PurpleConversation *conv;
	GList *info, *l;

	if (!pi->chat_info || !pi->chat_info_defaults ||
	    !(info = pi->chat_info(purple_account_get_connection(pd->account)))) {
		imcb_error(ic, "Joining chatrooms not supported by this protocol");
		return NULL;
	}

	if ((conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT,
	                                                  room, pd->account))) {
		purple_conversation_destroy(conv);
	}

	chat_hash = pi->chat_info_defaults(
	        purple_account_get_connection(pd->account), room
	);

	for (l = info; l; l = l->next) {
		struct proto_chat_entry *pce = l->data;

		if (strcmp(pce->identifier, "handle") == 0) {
			g_hash_table_replace(chat_hash, "handle", g_strdup(nick));
		} else if (strcmp(pce->identifier, "password") == 0) {
			g_hash_table_replace(chat_hash, "password", g_strdup(password));
		} else if (strcmp(pce->identifier, "passwd") == 0) {
			g_hash_table_replace(chat_hash, "passwd", g_strdup(password));
		}

		g_free(pce);
	}

	g_list_free(info);

	serv_join_chat(purple_account_get_connection(pd->account), chat_hash);

	g_hash_table_destroy(chat_hash);

	return imcb_chat_new(ic, room);
}
Beispiel #4
0
/*
 * call-seq:
 * join_chat(chat_id)
 *
 * Join chat
 */
static VALUE account_join_chat(VALUE self, VALUE name)
{
  PurpleAccount *account;
  Data_Get_Struct(self, PurpleAccount, account);
  GHashTable *data;

  if (purple_account_is_connected(account)) {
    data = g_hash_table_new(g_str_hash, g_str_equal);

    g_hash_table_insert(data, "chat_id", StringValueCStr(name));

    serv_join_chat(purple_account_get_connection(account), data);

    g_hash_table_destroy(data);

    return Qtrue;
  }

  return Qfalse;
}
static int account_join_chat(LuaState *L)
{
    PurpleAccount **account = ms_lua_checkclass(L, "purple.account", 1);
    const char *name         = luaL_checkstring(L, 2);

    g_return_val_if_fail(purple_account_is_connected(*account), 0);

    PurpleConnection *pc = purple_account_get_connection(*account);
    PurpleConversation *conv = purple_find_conversation_with_account(
            PURPLE_CONV_TYPE_CHAT,
            name,
            *account);

    if (conv) {
        purple_conversation_present(conv);
    }
    else {
        conv = purple_conversation_new(
                PURPLE_CONV_TYPE_CHAT,
                *account,
                name);
        purple_conv_chat_left(PURPLE_CONV_CHAT(conv));
    }

    GHashTable *hash;
    PurpleChat *chat = purple_blist_find_chat(*account, name);
    if (chat == NULL) {
        PurplePluginProtocolInfo *info = PURPLE_PLUGIN_PROTOCOL_INFO(
                purple_connection_get_prpl(pc));
        if (info->chat_info_defaults != NULL)
            hash = info->chat_info_defaults(pc, name);
    } else {
        hash = purple_chat_get_components(chat);
    }

    serv_join_chat(pc, hash);
    if (chat == NULL && hash != NULL)
        g_hash_table_destroy(hash);

    return 0;
}
Beispiel #6
0
static gboolean yahoo_uri_handler(const char *proto, const char *cmd, GHashTable *params)
{
	char *acct_id = g_hash_table_lookup(params, "account");
	PurpleAccount *acct;

	if (g_ascii_strcasecmp(proto, "ymsgr"))
		return FALSE;

	acct = find_acct(purple_plugin_get_id(my_protocol), acct_id);

	if (!acct)
		return FALSE;

	/* ymsgr:SendIM?screename&m=The+Message */
	if (!g_ascii_strcasecmp(cmd, "SendIM")) {
		char *sname = NULL;
		g_hash_table_foreach(params, yahoo_find_uri_novalue_param, &sname);
		if (sname) {
			char *message = g_hash_table_lookup(params, "m");

			PurpleConversation *conv = purple_find_conversation_with_account(
				PURPLE_CONV_TYPE_IM, sname, acct);
			if (conv == NULL)
				conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, sname);
			purple_conversation_present(conv);

			if (message) {
				/* Spaces are encoded as '+' */
				g_strdelimit(message, "+", ' ');
				purple_conv_send_confirm(conv, message);
			}
		}
		/* else
			**If pidgindialogs_im() was in the core, we could use it here.
			 * It is all purple_request_* based, but I'm not sure it really belongs in the core
			pidgindialogs_im(); */

		return TRUE;
	}
	/* ymsgr:Chat?roomname */
	else if (!g_ascii_strcasecmp(cmd, "Chat")) {
		char *rname = NULL;
		g_hash_table_foreach(params, yahoo_find_uri_novalue_param, &rname);
		if (rname) {
			/* This is somewhat hacky, but the params aren't useful after this command */
			g_hash_table_insert(params, g_strdup("room"), g_strdup(rname));
			g_hash_table_insert(params, g_strdup("type"), g_strdup("Chat"));
			serv_join_chat(purple_account_get_connection(acct), params);
		}
		/* else
			** Same as above (except that this would have to be re-written using purple_request_*)
			pidgin_blist_joinchat_show(); */

		return TRUE;
	}
	/* ymsgr:AddFriend?name */
	else if (!g_ascii_strcasecmp(cmd, "AddFriend")) {
		char *name = NULL;
		g_hash_table_foreach(params, yahoo_find_uri_novalue_param, &name);
		purple_blist_request_add_buddy(acct, name, NULL, NULL);
		return TRUE;
	}

	return FALSE;
}
Beispiel #7
0
void PurpleIMChat::createPurpleChat(PurpleConnection *gGC, int id, GList *users, PurpleIMChat & imChat, PurpleAccount* gAccount)	//VOXOX - JRT - 2009.07.10 
{
	char chatName[256];
	mConvInfo_t *mConv = FindChatStructById(id);
	PurpleConversation *gConv = NULL;
	EnumIMProtocol::IMProtocol protocol = PurpleIMPrcl::GetEnumIMProtocol(gGC->account->protocol_id);

	if (mConv == NULL)
	{
		//Create IMChatSession and copy some values from IMChat.
		mConv = CreateChatSession(true, imChat);
		mConv->conv_session->setIMChatType( imChat.getIMChatType() );
//		mConv->conv_session->getGroupChatInfo() = imChat.getGroupChatInfo();
	}

	//VOXOX - JRT - 2009.06.15 - purple_conversation_get_name() uses this to id (numeric)!
	//		Since id is ChatSession Address (0x), if you change this, then some 'find's will fail.
	//		You will need your own data members to track alias, etc.
	//		NOTE: This may be JABBER ONLY.
//	snprintf(chatName, sizeof(chatName), "Chat%d", mConv->conv_id);		
	strcpy( chatName, imChat.getGroupChatInfo().getAlias().c_str() );

	if (protocol == EnumIMProtocol::IMProtocolMSN)
	{
		//VOXOX - JRT - 2009.06.18 - TODO: check on use of 'chatname'; move to switch in following else-clause.
		gConv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, chatName, gGC->account);

		if (!gConv)
			LOG_FATAL("Chat doesn't exist !!");

		mConv->purple_conv_session = gConv;
	//	gConv->ui_data = mConv;
	}
	else
	{
		GHashTable *components;

		components = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);

		char *room   = NULL;
		char *server = NULL;

		g_hash_table_replace(components, g_strdup("room"), g_strdup(chatName));

		switch( protocol )
		{
		case EnumIMProtocol::IMProtocolYahoo:
			g_hash_table_replace(components, g_strdup("topic"), g_strdup("Join my conference..."));
			g_hash_table_replace(components, g_strdup("type"),  g_strdup("Conference"));
			break;

		case EnumIMProtocol::IMProtocolAIM:
		case EnumIMProtocol::IMProtocolICQ:
			//Defaults for:
			//	"room"		- empty or passed in value (NULL below)
			//  "exchange"	- "4"
			components = serv_chat_info_defaults( gGC, NULL );
			g_hash_table_replace(components, g_strdup("exchange"), g_strdup("16"));			//VOXOX - JRT - 2009.06.14 - why do we use "16"?
			g_hash_table_replace(components, g_strdup("room"),     g_strdup(chatName));

			room   = (char*)g_hash_table_lookup(components, "room");
//			server = (char*)g_hash_table_lookup(components, "server");		//TODO: 

			break;

		case EnumIMProtocol::IMProtocolJabber:
			std::string userChatRoomName = (imChat.getGroupChatInfo().getAlias().empty() ? chatName : imChat.getGroupChatInfo().getAlias());

			//This will return defaults for:
			//	"server" - conference.im.voxox.com
			//  "room"	 - user-defined, or parsed from room@server/handle
			//	"handle" - user id without domain.  "*****@*****.**" -> "user"
			components = serv_chat_info_defaults( gGC, NULL );	//VOXOX - JRT - 2009.06.14 - Get defaults, like server (conference.im.voxox.com)
			g_hash_table_replace(components, g_strdup("room"),   g_strdup(chatName));

			room   = (char*)g_hash_table_lookup(components, "room");
			server = (char*)g_hash_table_lookup(components, "server");

			break;
		}

		std::string fullRoomName = room;

		if ( server != NULL )		//VOXOX - JRT - 2009.10.12 - AIM gives NULL server.
		{
		fullRoomName += "@";
		fullRoomName += server;
		}

		mConv->conv_session->getGroupChatInfo().setChatRoom( fullRoomName );
		mConv->pending_invites = users;
			
//		purple_conversation_new(PURPLE_CONV_TYPE_CHAT, gAccount, fullRoomName.c_str());	//JRT-XXX

		serv_join_chat(gGC, components);
		g_hash_table_destroy(components);
	}
}