Пример #1
0
static struct groupchat *jabber_chat_join_( struct im_connection *ic, const char *room, const char *nick, const char *password, set_t **sets )
{
	if( strchr( room, '@' ) == NULL )
		imcb_error( ic, "Invalid room name: %s", room );
	else if( jabber_chat_by_jid( ic, room ) )
		imcb_error( ic, "Already present in chat `%s'", room );
	else
		return jabber_chat_join( ic, room, nick, set_getstr( sets, "password" ) );
	
	return NULL;
}
Пример #2
0
static gboolean xmpp_uri_handler(const char *proto, const char *user, GHashTable *params)
{
	char *acct_id = params ? g_hash_table_lookup(params, "account") : NULL;
	PurpleAccount *acct;

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

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

	if (!acct)
		return FALSE;

	/* xmpp:[email protected]?message;subject=Test%20Message;body=Here%27s%20a%20test%20message */
	/* params is NULL if the URI has no '?' (or anything after it) */
	if (!params || g_hash_table_lookup_extended(params, "message", NULL, NULL)) {
		char *body = g_hash_table_lookup(params, "body");
		if (user && *user) {
			PurpleConversation *conv =
					purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, user);
			purple_conversation_present(conv);
			if (body && *body)
				purple_conv_send_confirm(conv, body);
		}
	} else if (g_hash_table_lookup_extended(params, "roster", NULL, NULL)) {
		char *name = g_hash_table_lookup(params, "name");
		if (user && *user)
			purple_blist_request_add_buddy(acct, user, NULL, name);
	} else if (g_hash_table_lookup_extended(params, "join", NULL, NULL)) {
		PurpleConnection *gc = purple_account_get_connection(acct);
		if (user && *user) {
			GHashTable *params = jabber_chat_info_defaults(gc, user);
			jabber_chat_join(gc, params);
		}
		return TRUE;
	}

	return FALSE;
}
Пример #3
0
struct groupchat *jabber_chat_with(struct im_connection *ic, char *who)
{
	struct jabber_data *jd = ic->proto_data;
	struct jabber_chat *jc;
	struct groupchat *c;
	sha1_state_t sum;
	double now = gettime();
	char *uuid, *rjid, *cserv;

	sha1_init(&sum);
	sha1_append(&sum, (uint8_t *) ic->acc->user, strlen(ic->acc->user));
	sha1_append(&sum, (uint8_t *) &now, sizeof(now));
	sha1_append(&sum, (uint8_t *) who, strlen(who));
	uuid = sha1_random_uuid(&sum);

	if (jd->flags & JFLAG_GTALK) {
		cserv = g_strdup("groupchat.google.com");
	} else {
		/* Guess... */
		cserv = g_strdup_printf("conference.%s", jd->server);
	}

	rjid = g_strdup_printf("private-chat-%s@%s", uuid, cserv);
	g_free(uuid);
	g_free(cserv);

	c = jabber_chat_join(ic, rjid, jd->username, NULL);
	g_free(rjid);
	if (c == NULL) {
		return NULL;
	}

	jc = c->data;
	jc->invite = g_strdup(who);

	return c;
}
Пример #4
0
static struct groupchat *jabber_chat_join_(struct im_connection *ic, const char *room, const char *nick,
        const char *password, set_t **sets)
{
    struct jabber_data *jd = ic->proto_data;
    char *final_nick;

    /* Ignore the passed nick parameter if we have our own default */
    if (!(final_nick = set_getstr(sets, "nick")) &&
            !(final_nick = set_getstr(&ic->acc->set, "display_name"))) {
        /* Well, whatever, actually use the provided default, then */
        final_nick = (char *) nick;
    }

    if (strchr(room, '@') == NULL) {
        imcb_error(ic, "%s is not a valid Jabber room name. Maybe you mean %s@conference.%s?",
                   room, room, jd->server);
    } else if (jabber_chat_by_jid(ic, room)) {
        imcb_error(ic, "Already present in chat `%s'", room);
    } else {
        return jabber_chat_join(ic, room, final_nick, set_getstr(sets, "password"));
    }

    return NULL;
}
Пример #5
0
static struct groupchat *jabber_chat_join_(struct im_connection *ic, const char *room, const char *nick,
                                           const char *password, set_t **sets)
{
	struct jabber_data *jd = ic->proto_data;
	char *final_nick;

	/* Ignore the passed nick parameter if we have our own default */
	if (!(final_nick = set_getstr(sets, "nick")) &&
	    !(final_nick = set_getstr(&ic->acc->set, "display_name"))) {
		/* Well, whatever, actually use the provided default, then */
		final_nick = (char *) nick;
	}

	if (jd->flags & JFLAG_HIPCHAT && jd->muc_host && !g_str_has_suffix(room, jd->muc_host)) {
		char *guessed_name = hipchat_guess_channel_name(ic, room);
		if (guessed_name) {
			set_setstr(sets, "room", guessed_name);
			g_free(guessed_name);

			/* call this same function again with the fixed name */
			return jabber_chat_join_(ic, set_getstr(sets, "room"), nick, password, sets);
		}
	}

	if (strchr(room, '@') == NULL) {
		imcb_error(ic, "%s is not a valid Jabber room name. Maybe you mean %s@conference.%s?",
		           room, room, jd->server);
	} else if (jabber_chat_by_jid(ic, room)) {
		imcb_error(ic, "Already present in chat `%s'", room);
	} else {
		/* jabber_chat_join without the underscore is the conference.c one */
		return jabber_chat_join(ic, room, final_nick, set_getstr(sets, "password"));
	}

	return NULL;
}