Beispiel #1
0
PurpleCmdRet flist_global_kick_ban_unban_cmd(PurpleConversation *convo, const gchar *cmd, gchar **args, gchar **error, void *data) {
    PurpleConnection *pc = purple_conversation_get_gc(convo);
    FListAccount *fla = pc->proto_data;
    const gchar *character, *code;
    JsonObject *json;
    FListFlags flags;

    flags = flist_get_flags(fla, NULL, fla->proper_character);
    if(!(flags & (FLIST_FLAG_ADMIN | FLIST_FLAG_GLOBAL_OP))) {
        *error = g_strdup(_("You must be a global operator to globally kick, ban, or unban."));
        return PURPLE_CMD_STATUS_FAILED;
    }

    if(!purple_utf8_strcasecmp(cmd, "gkick")) code = FLIST_GLOBAL_KICK;
    if(!purple_utf8_strcasecmp(cmd, "ipban")) code = FLIST_GLOBAL_IP_BAN;
    if(!purple_utf8_strcasecmp(cmd, "accountban")) code = FLIST_GLOBAL_ACCOUNT_BAN;
    if(!purple_utf8_strcasecmp(cmd, "gunban")) code = FLIST_GLOBAL_UNBAN;
    if(!code) return PURPLE_CMD_STATUS_NOT_FOUND;

    character = args[0];

    json = json_object_new();
    json_object_set_string_member(json, "character", character);
    flist_request(pc, code, json);
    json_object_unref(json);

    return PURPLE_CMD_STATUS_OK;
}
Beispiel #2
0
PurpleCmdRet flist_create_kill_channel_cmd(PurpleConversation *convo, const gchar *cmd, gchar **args, gchar **error, void *data) {
    PurpleConnection *pc = purple_conversation_get_gc(convo);
    FListAccount *fla = pc->proto_data;
    const gchar *channel, *code;
    JsonObject *json;
    FListFlags flags;

    flags = flist_get_flags(fla, NULL, fla->proper_character);
    if(!(flags & (FLIST_FLAG_ADMIN | FLIST_FLAG_GLOBAL_OP))) {
        *error = g_strdup(_("You must be a global operator to create or delete public channels."));
        return PURPLE_CMD_STATUS_FAILED;
    }

    if(!purple_utf8_strcasecmp(cmd, "createchannel")) code = FLIST_PUBLIC_CHANNEL_CREATE;
    if(!purple_utf8_strcasecmp(cmd, "killchannel")) code = FLIST_PUBLIC_CHANNEL_DELETE;
    if(!code) return PURPLE_CMD_STATUS_NOT_FOUND;

    channel = args[0];

    json = json_object_new();
    json_object_set_string_member(json, "channel", channel);
    flist_request(pc, code, json);
    json_object_unref(json);

    return PURPLE_CMD_STATUS_OK;
}
Beispiel #3
0
PurpleCmdRet flist_admin_op_deop_cmd(PurpleConversation *convo, const gchar *cmd, gchar **args, gchar **error, void *data) {
    PurpleConnection *pc = purple_conversation_get_gc(convo);
    FListAccount *fla = pc->proto_data;
    const gchar *character, *code;
    JsonObject *json;
    FListFlags flags;

    flags = flist_get_flags(fla, NULL, fla->proper_character);
    if(!(flags & FLIST_FLAG_ADMIN)) {
        *error = g_strdup(_("You must be an administrator to add or remove global operators."));
        return PURPLE_CMD_STATUS_FAILED;
    }

    if(!purple_utf8_strcasecmp(cmd, "op")) code = FLIST_CHANNEL_BAN;
    if(!purple_utf8_strcasecmp(cmd, "deop")) code = FLIST_CHANNEL_UNBAN;
    if(!code) return PURPLE_CMD_STATUS_NOT_FOUND;

    character = args[0];

    json = json_object_new();
    json_object_set_string_member(json, "character", character);
    flist_request(pc, code, json);
    json_object_unref(json);

    return PURPLE_CMD_STATUS_OK;
}
Beispiel #4
0
bool PurpleIMChat::addContactCbk(void * dataIn)
{
	Mutex::ScopedLock lock(PurpleIMChat::_mutex);

	PurpleIMChatCallbackData* cbData = (PurpleIMChatCallbackData*) dataIn;

	PurpleIMChat*	imChat		= cbData->getPurpleIMChat();
	IMChatSession*	chatSession = cbData->getIMChatSession();
	PurpleAccount*	gAccount	= getPurpleAccount( imChat->getIMAccount() );

//	const char * contactId = (const char *)((misc_t *)data)->data_ptr2;
	mConvInfo_t *mConv = FindChatStructById(chatSession->getId());
	int BuddyNbr = chatSession->getIMContactSet().size();
	PurpleConversation *gConv = NULL;

	if (mConv)
		gConv = mConv->purple_conv_session;		//VOXOX - JRT - 2009.07.09 
	else
		LOG_FATAL("ConvInfo not created !!!");

	if (purple_conversation_get_type(gConv) == PURPLE_CONV_TYPE_IM)
	{
		GList *mlist = NULL;
		IMContactSet& chatContact = const_cast<IMContactSet&>(chatSession->getIMContactSet());
		IMContactSet::const_iterator it = chatContact.begin();
		const std::string & firstContactId = it->getContactId();
		PurpleConnection *gGC;

		gConv = mConv->purple_conv_session;	//VOXOX - JRT - 2009.07.09 
		gGC = purple_conversation_get_gc(gConv);
		mlist = g_list_append(mlist, const_cast<char*>(cbData->getContactId().c_str()) );
		mlist = g_list_append(mlist, (char *) firstContactId.c_str());

		createPurpleChat(gGC, chatSession->getId(), mlist, *imChat, gAccount);	//VOXOX - JRT - 2009.07.10 
	}
	else if (purple_conversation_get_type(gConv) == PURPLE_CONV_TYPE_CHAT)
	{
		serv_chat_invite(purple_conversation_get_gc(gConv), purple_conv_chat_get_id(PURPLE_CONV_CHAT(gConv)), NULL, cbData->getContactId().c_str() );
	}

	timeoutRemove( cbData );

	delete cbData;

	return TRUE;
}
Beispiel #5
0
/*------------------------------------------------------------------------
 * This gets called when a new chat conversation is opened by the user
 *
 *  @param conv				The conversation object
 *  @param session			The MXit session object
 */
static void mxit_cb_chat_created( PurpleConversation* conv, struct MXitSession* session )
{
	PurpleConnection*	gc;
	struct contact*		contact;
	PurpleBuddy*		buddy;
	const char*			who;
	char*				tmp;

	gc = purple_conversation_get_gc( conv );
	if ( session->con != gc ) {
		/* not our conversation */
		return;
	}
	else if ( purple_conversation_get_type( conv ) != PURPLE_CONV_TYPE_IM ) {
		/* wrong type of conversation */
		return;
	}

	/* get the contact name */
	who = purple_conversation_get_name( conv );
	if ( !who )
		return;

	purple_debug_info( MXIT_PLUGIN_ID, "Conversation started with '%s'\n", who );

	/* find the buddy object */
	buddy = purple_find_buddy( session->acc, who );
	if ( !buddy )
		return;

	contact = purple_buddy_get_protocol_data( buddy );
	if ( !contact )
		return;

	/* we ignore all conversations with which we have chatted with in this session */
	if ( find_active_chat( session->active_chats, who ) )
		return;

	/* determine if this buddy is a MXit service */
	switch ( contact->type ) {
		case MXIT_TYPE_BOT :
		case MXIT_TYPE_CHATROOM :
		case MXIT_TYPE_GALLERY :
		case MXIT_TYPE_INFO :
				tmp = g_strdup_printf("<font color=\"#999999\">%s</font>\n", _( "Loading menu..." ));
				serv_got_im( session->con, who, tmp, PURPLE_MESSAGE_NOTIFY, time( NULL ) );
				g_free( tmp );
				mxit_send_message( session, who, " ", FALSE, FALSE );
		default :
				break;
	}
}
Beispiel #6
0
void PurpleChatMngr::ChatJoinedCbk(PurpleConversation *conv)
{
	mConvInfo_t *mConv = (mConvInfo_t *) conv->ui_data;

	if (mConv->pending_invites)
	{
		for (GList *l = mConv->pending_invites; l != NULL; l = l->next)
		{
			serv_chat_invite(purple_conversation_get_gc(conv),
				purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)),
				"Join my conference...", (char *)l->data);
		}
	}
}
Beispiel #7
0
/**
 * A function to send a chat or im message to the specific conversation
 * without emitting "sending-im" or "sending-chat" signal, which would
 * cause an infinite loop for this plugin.
 *
 * taken from conversation.c with signal emission removed.
 */
static void
splitter_common_send(PurpleConversation *conv, const char *message,
                     PurpleMessageFlags msgflags)
{
	PurpleConversationType type;
	PurpleAccount *account;
	PurpleConnection *gc;
	char *sent = NULL;

	if (strlen(message) == 0)
		return;

	account = purple_conversation_get_account(conv);
#if PURPLE_VERSION_CHECK(3,0,0)
	gc = purple_conversation_get_connection(conv);
#else
	gc = purple_conversation_get_gc(conv);
#endif

	g_return_if_fail(account != NULL);
	g_return_if_fail(gc != NULL);

	type = purple_conversation_get_type(conv);

	if ((purple_conversation_get_features(conv) & PURPLE_CONNECTION_HTML) &&
		!(msgflags & PURPLE_MESSAGE_RAW))
	{
		sent = purple_markup_linkify(message);
	}
	else
		sent = g_strdup(message);

	msgflags |= PURPLE_MESSAGE_SEND;

	splitter_injected_message = TRUE;

	if (type == PURPLE_CONV_TYPE_IM) {
		if (sent != NULL && sent[0] != '\0')
			purple_conv_im_send_with_flags(PURPLE_CONV_IM(conv), sent, msgflags);
	}
	else {
		if (sent != NULL && sent[0] != '\0')
			purple_conv_chat_send_with_flags(PURPLE_CONV_CHAT(conv), sent, msgflags);
	}

	splitter_injected_message = FALSE;

	g_free(sent);
}
/*static void
toggle_nickchange_pref(const char *name, PurplePrefType type, gconstpointer val, gpointer data)
{
	
}*/
static void nickchange_chat_rename_user
(PurpleConversation *conv, const char *old_user, const char *new_user, const char *new_alias)
{
	if (!should_hide_notice(conv, old_user, userstable)) {
		PurpleConvChat *chat = PURPLE_CONV_CHAT(conv);
		char tmp[2048];
		
		if (purple_strequal(chat->nick, purple_normalize(conv->account, old_user))) {
			// Its me!
			char *escaped = g_markup_escape_text(new_user, -1);
			g_snprintf(tmp, sizeof(tmp),
					_("You are now known as %s"), escaped);
			g_free(escaped);
		} else {
			const char *old_alias = old_user;
			const char *new_alias = new_user;
			char *escaped;
			char *escaped2;
			PurpleConnection *gc = purple_conversation_get_gc(conv);
			PurplePluginProtocolInfo *prpl_info;
			
			prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(purple_connection_get_prpl(gc));
			if (prpl_info && !(prpl_info->options & OPT_PROTO_UNIQUE_CHATNAME)) {
				PurpleBuddy *buddy;

				if ((buddy = purple_find_buddy(gc->account, old_user)) != NULL)
					old_alias = purple_buddy_get_contact_alias(buddy);
				if ((buddy = purple_find_buddy(gc->account, new_user)) != NULL)
					new_alias = purple_buddy_get_contact_alias(buddy);
			}

			escaped = g_markup_escape_text(old_alias, -1);
			escaped2 = g_markup_escape_text(new_alias, -1);
			g_snprintf(tmp, sizeof(tmp),
					_("%s is now known as %s"), escaped, escaped2);
			g_free(escaped);
			g_free(escaped2);
		}

		purple_conversation_write(conv, NULL, tmp,
				PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LINKIFY,
				time(NULL));
	}
	
	if (orig_chat_rename_user)
		return orig_chat_rename_user(conv, old_user, new_user, new_alias);
}
Beispiel #9
0
bool PurpleIMChat::changeTypingStateCbk(void * dataIn)
{
	Mutex::ScopedLock lock(PurpleIMChat::_mutex);

	PurpleIMChatCallbackData* cbData = (PurpleIMChatCallbackData*) dataIn;

	IMChatSession*		chatSession = cbData->getIMChatSession();
	IMChat::TypingState state		= cbData->getTypingState();
	PurpleTypingState	gState		 = PURPLE_NOT_TYPING;
	mConvInfo_t			*mConv		 = FindChatStructById(chatSession->getId());
	PurpleConversation	*gConv		 = NULL;

	if (mConv) 
	{
//		if ((gConv = (PurpleConversation *)mConv->purple_conv_session))		//VOXOX - JRT - 2009.07.09 This is poor coding technique!
		gConv = mConv->purple_conv_session;

		if ( gConv ) 
		{
			switch (state)
			{
			case IMChat::TypingStateTyping:
				gState = PURPLE_TYPING;
				break;

			case IMChat::TypingStateStopTyping:
			//gState = PURPLE_TYPED;
				gState = PURPLE_NOT_TYPING;
				break;

			default:
				gState = PURPLE_NOT_TYPING;
				break;
			}

			serv_send_typing(purple_conversation_get_gc(gConv), purple_conversation_get_name(gConv), gState);
		}
	}

	timeoutRemove( cbData );

	delete cbData;

	return TRUE;
}
Beispiel #10
0
PurpleCmdRet flist_timeout_cmd(PurpleConversation *convo, const gchar *cmd, gchar **args, gchar **error, void *data) {
    PurpleConnection *pc = purple_conversation_get_gc(convo);
    FListAccount *fla = pc->proto_data;
    gchar **split; guint count;
    const gchar *character, *time, *reason;
    gulong time_parsed; gchar *endptr;
    JsonObject *json;
    FListFlags flags;

    flags = flist_get_flags(fla, NULL, fla->proper_character);
    if(!(flags & (FLIST_FLAG_ADMIN | FLIST_FLAG_GLOBAL_OP))) {
        *error = g_strdup(_("You must be a global operator to timeban."));
        return PURPLE_CMD_STATUS_FAILED;
    }

    split = g_strsplit(args[0], ",", 3);
    count = g_strv_length(split);

    if(count < 3) {
        g_strfreev(split);
        *error = g_strdup(_("You must enter a character, a time, and a reason."));
        return PURPLE_CMD_STATUS_WRONG_ARGS;
    }

    character = split[0];
    time = g_strchug(split[1]);
    reason = g_strchug(split[2]);

    time_parsed = strtoul(time, &endptr, 10);
    if(time_parsed == 0 || endptr != time + strlen(time)) {
        g_strfreev(split);
        *error = g_strdup(_("You must enter a valid length of time."));
        return PURPLE_CMD_STATUS_WRONG_ARGS;
    }
    
    json = json_object_new();
    json_object_set_string_member(json, "character", character);
    json_object_set_string_member(json, "reason", reason);
    json_object_set_int_member(json, "time", time_parsed);
    flist_request(pc, FLIST_GLOBAL_TIMEOUT, json);
    json_object_unref(json);
    g_strfreev(split);
    return PURPLE_CMD_STATUS_OK;
}
Beispiel #11
0
static PurpleCmdRet irc_parse_purple_cmd(PurpleConversation *conv, const gchar *cmd,
                                        gchar **args, gchar **error, void *data)
{
	PurpleConnection *gc;
	struct irc_conn *irc;
	struct _irc_user_cmd *cmdent;

	gc = purple_conversation_get_gc(conv);
	if (!gc)
		return PURPLE_CMD_RET_FAILED;

	irc = gc->proto_data;

	if ((cmdent = g_hash_table_lookup(irc->cmds, cmd)) == NULL)
		return PURPLE_CMD_RET_FAILED;

	(cmdent->cb)(irc, cmd, purple_conversation_get_name(conv), (const char **)args);

	return PURPLE_CMD_RET_OK;
}
Beispiel #12
0
PurpleCmdRet flist_reward_cmd(PurpleConversation *convo, const gchar *cmd, gchar **args, gchar **error, void *data) {
    PurpleConnection *pc = purple_conversation_get_gc(convo);
    FListAccount *fla = pc->proto_data;
    const gchar *character;
    JsonObject *json;
    FListFlags flags;

    flags = flist_get_flags(fla, NULL, fla->proper_character);
    if(!(flags & (FLIST_FLAG_ADMIN | FLIST_FLAG_GLOBAL_OP))) {
        *error = g_strdup(_("You must be a global operator to reward a user."));
        return PURPLE_CMD_STATUS_FAILED;
    }

    character = args[0];

    json = json_object_new();
    json_object_set_string_member(json, "character", character);
    flist_request(pc, FLIST_REWARD, json);
    json_object_unref(json);

    return PURPLE_CMD_STATUS_OK;
}
Beispiel #13
0
PurpleCmdRet flist_broadcast_cmd(PurpleConversation *convo, const gchar *cmd, gchar **args, gchar **error, void *data) {
    PurpleConnection *pc = purple_conversation_get_gc(convo);
    FListAccount *fla = pc->proto_data;
    const gchar *message;
    JsonObject *json;
    FListFlags flags;

    flags = flist_get_flags(fla, NULL, fla->proper_character);
    if(!(flags & (FLIST_FLAG_ADMIN))) {
        *error = g_strdup(_("You must be an administrator to send a global broadcast."));
        return PURPLE_CMD_STATUS_FAILED;
    }

    message = args[0];

    json = json_object_new();
    json_object_set_string_member(json, "message", message);
    flist_request(pc, FLIST_BROADCAST, json);
    json_object_unref(json);

    return PURPLE_CMD_STATUS_OK;
}
Beispiel #14
0
static gboolean
catch_hotkeys_cb (PidginWindow * win, GdkEventKey * event) {
    if (event->is_modifier == FALSE) {
        gint all_modifiers = 0;
        PurpleConversation *conv = NULL;

        if (event->state & GDK_SHIFT_MASK)
            all_modifiers |= GDK_SHIFT_MASK;
        if (event->state & GDK_CONTROL_MASK)
            all_modifiers |= GDK_CONTROL_MASK;
        if (event->state & GDK_MOD1_MASK)
            all_modifiers |= GDK_MOD1_MASK;

        conv = pidgin_conv_window_get_active_conversation (win);

        if (gdk_keyval_to_lower (event->keyval) ==
            (guint) purple_prefs_get_int (PREF_HOTKEYS_SEND_AS_FILE)
            &&
            all_modifiers ==
            purple_prefs_get_int (PREF_HOTKEYS_SEND_AS_FILE_MDFS))
        {

            PurpleConnection *gc = NULL;
            PurplePluginProtocolInfo *prpl_info = NULL;

            gc = purple_conversation_get_gc (conv);

            if ((gc != NULL) &&
                ((purple_conversation_get_type (conv) !=
                  PURPLE_CONV_TYPE_CHAT)
                 || !purple_conv_chat_has_left (PURPLE_CONV_CHAT (conv)))) {

                prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO (gc->prpl);
                if (purple_conversation_get_type (conv) ==
                    PURPLE_CONV_TYPE_IM
                    && prpl_info->send_file != NULL
                    && (!prpl_info->can_receive_file
                        || prpl_info->can_receive_file (gc,
                                                        purple_conversation_get_name
                                                        (conv)))) {
                    PurplePlugin *plugin =
                        purple_plugins_find_with_id (PLUGIN_ID);

                    if (PLUGIN (locked))
                        return FALSE;   /* Just return, don't fail. */
                    else {
                        PLUGIN (locked) = TRUE;
                        PLUGIN (send_as) = SEND_AS_FILE;
                        REMEMBER_ACCOUNT (PIDGIN_CONVERSATION (conv));
                        freeze_desktop (plugin, FALSE);
                    }
                }
            }
        }
#ifdef ENABLE_UPLOAD
        else if (gdk_keyval_to_lower (event->keyval) ==
                 (guint) purple_prefs_get_int (PREF_HOTKEYS_SEND_AS_FTP)
                 &&
                 all_modifiers ==
                 purple_prefs_get_int (PREF_HOTKEYS_SEND_AS_FTP_MDFS)
            )
	  send_as_ftp_link(win, NULL);
	  //on_screenshot_insert_as_ftp_link_fromwin_activate_cb (win);
        else if (gdk_keyval_to_lower (event->keyval) ==
                 (guint) purple_prefs_get_int (PREF_HOTKEYS_SEND_AS_HTTP)
                 &&
                 all_modifiers ==
                 purple_prefs_get_int (PREF_HOTKEYS_SEND_AS_HTTP_MDFS)
            )
	  send_as_link(win, NULL);
	  //on_screenshot_insert_as_link_fromwin_activate_cb (win);
#endif
        else if (gdk_keyval_to_lower (event->keyval) == (guint)
                 purple_prefs_get_int (PREF_HOTKEYS_SEND_AS_IMAGE)
                 &&
                 all_modifiers ==
                 purple_prefs_get_int (PREF_HOTKEYS_SEND_AS_IMAGE_MDFS)
		 ) {
          //  if (!(purple_conversation_get_features (conv) &
	  //      PURPLE_CONNECTION_NO_IMAGES))
	  //  on_screenshot_insert_as_image_fromwin_activate_cb (win);
        }
        else {
            /* nothing match ! */
        }
        return TRUE;
    }
    return FALSE;               /* let the signal be handled by other callbacks */
}
static void send_request_confirmed(MMConversation *mmconv)
{
	PurpleConnection *connection = purple_conversation_get_gc(mmconv->conv);
	const char *convName = purple_conversation_get_name(mmconv->conv);
	serv_send_im(connection, convName, MUSICMESSAGING_CONFIRM_MSG, PURPLE_MESSAGE_SEND);
}
Beispiel #16
0
void PurpleChatMngr::ChatLeftCbk(PurpleConversation *conv)
{
	serv_chat_leave(purple_conversation_get_gc(conv), purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)) );
}