Esempio n. 1
0
void hon_parse_channel_promote_demote(PurpleConnection *gc,gchar* buffer,guint16 packet_id){
    hon_account* hon = gc->proto_data;
    guint32 chatid,kickerid,kickedid;
    gchar* kicked,*kicker,*msg;
    PurpleConversation* chat;
    const char* action,*rank;
    PurpleConvChatBuddyFlags chatbuddy_flags;

    chatid = read_guint32(buffer);
    kickedid = read_guint32(buffer);
    kickerid = read_guint32(buffer);
    chat = purple_find_chat(gc,chatid);
    if (!chat)
        return;

    if (kickerid == hon->self.account_id)
        kicker = hon->self.nickname;
    else if((kicker = g_hash_table_lookup(hon->id2nick,GINT_TO_POINTER(kickerid))))
    {}
    else
        kicker = _("Someone");

    if (kickedid == hon->self.account_id)
        kicked = hon->self.nickname;
    else if((kicked = g_hash_table_lookup(hon->id2nick,GINT_TO_POINTER(kickedid))))
    {}
    else
        return;

    
    chatbuddy_flags = purple_conv_chat_user_get_flags(PURPLE_CONV_CHAT(chat),kicked);
    if (packet_id == HON_SC_CHANNEL_PROMOTE)
    {
        action = _("promoted");
        if(chatbuddy_flags == PURPLE_CBFLAGS_NONE)
        {
            rank = _("Channel Officer");
            chatbuddy_flags = PURPLE_CBFLAGS_HALFOP;
        }
        else if (chatbuddy_flags == PURPLE_CBFLAGS_FOUNDER)
        {
            //nowhere to update .. "Stuff" maybe? o_O
            rank = _("Stuff");
        }
        else if (chatbuddy_flags == PURPLE_CBFLAGS_OP)
        {
            rank = _("Channel Administrator");
            chatbuddy_flags = PURPLE_CBFLAGS_FOUNDER;
        }
        else if (chatbuddy_flags == PURPLE_CBFLAGS_HALFOP)
        {
            rank = _("Channel Leader");
            chatbuddy_flags = PURPLE_CBFLAGS_OP;
        }
        else
            rank = _("huh?");
    }
    else
    {
        rank = _("huh?");
        action = _("demoted");

        if (chatbuddy_flags == PURPLE_CBFLAGS_FOUNDER)
        {
            rank = _("Channel Leader");
            chatbuddy_flags = PURPLE_CBFLAGS_OP;
        }
        else if (chatbuddy_flags == PURPLE_CBFLAGS_OP)
        {
            rank = _("Channel Officer");
            chatbuddy_flags = PURPLE_CBFLAGS_HALFOP;
        }
        else if (chatbuddy_flags == PURPLE_CBFLAGS_HALFOP)
        {
            rank = _("Non admin status");
            chatbuddy_flags = PURPLE_CBFLAGS_NONE;
        }


    }

    purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(chat),kicked,chatbuddy_flags);
    msg = g_strdup_printf(_("%s has been %s to %s by %s"),kicked,action,rank,kicker);
    purple_conv_chat_write(PURPLE_CONV_CHAT(chat), "", msg, PURPLE_MESSAGE_SYSTEM, time(NULL));

    g_free(msg);
}
Esempio n. 2
0
void irc_msg_mode(struct irc_conn *irc, const char *name, const char *from, char **args)
{
	PurpleConversation *convo;
	char *nick = irc_mask_nick(from), *buf;

	if (*args[0] == '#' || *args[0] == '&') {	/* Channel	*/
		char *escaped;
		convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, args[0], irc->account);
		if (!convo) {
			purple_debug(PURPLE_DEBUG_ERROR, "irc", "MODE received for %s, which we are not in\n", args[0]);
			g_free(nick);
			return;
		}
		escaped = (args[2] != NULL) ? g_markup_escape_text(args[2], -1) : NULL;
		buf = g_strdup_printf(_("mode (%s %s) by %s"), args[1], escaped ? escaped : "", nick);
		purple_conv_chat_write(PURPLE_CONV_CHAT(convo), args[0], buf, PURPLE_MESSAGE_SYSTEM, time(NULL));
		g_free(escaped);
		g_free(buf);
		if(args[2]) {
			PurpleConvChatBuddyFlags newflag, flags;
			char *mcur, *cur, *end, *user;
			gboolean add = FALSE;
			mcur = args[1];
			cur = args[2];
			while (*cur && *mcur) {
				if ((*mcur == '+') || (*mcur == '-')) {
					add = (*mcur == '+') ? TRUE : FALSE;
					mcur++;
					continue;
				}
				end = strchr(cur, ' ');
				if (!end)
					end = cur + strlen(cur);
				user = g_strndup(cur, end - cur);
				flags = purple_conv_chat_user_get_flags(PURPLE_CONV_CHAT(convo), user);
				newflag = PURPLE_CBFLAGS_NONE;
				if (*mcur == 'o')
					newflag = PURPLE_CBFLAGS_OP;
				else if (*mcur =='h')
					newflag = PURPLE_CBFLAGS_HALFOP;
				else if (*mcur == 'v')
					newflag = PURPLE_CBFLAGS_VOICE;
				else if(irc->mode_chars
					  && strchr(irc->mode_chars, '~') && (*mcur == 'q'))
					newflag = PURPLE_CBFLAGS_FOUNDER;
				if (newflag) {
					if (add)
						flags |= newflag;
					else
						flags &= ~newflag;
					purple_conv_chat_user_set_flags(PURPLE_CONV_CHAT(convo), user, flags);
				}
				g_free(user);
				cur = end;
				if (*cur)
					cur++;
				if (*mcur)
					mcur++;
			}
		}
	} else {					/* User		*/
	}
	g_free(nick);
}