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); }
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); }