String opModes = "qaohv"; // Modes that give users power String cParamModes = "flk"; // Channel modes that require parameters // All other modes are channel modes without parameters, with the exception of "bie" boolean added = true; char[] array = line.substring(line.indexOf(tok[2]) + tok[2].length() +1).split("\\s+")[0].toCharArray(); Hashtable add = new Hashtable(); Hashtable remove = new Hashtable(); int i = 0; for (char m : array) { if (m == '+') { added = true; } else if (m == '-') { added = false; } if (opModes.contains("" + m)) { (added ? add : remove).put(i, "" + m); i++; } else if (cParamModes.contains("" + m) || m == 'b' || m == 'e' || m == 'f') { i++; } } String modeLine = new String(array); String[] params = line.substring(line.indexOf(modeLine) + modeLine.length() + 1).split("\\s+"); Channel c = storage.getChannel(tok[2]); if (c == null) { con.log("Unknown channel, modes set! (" + tok[2] + ")"); return; } for (int index : add.keySet()) { if (index >= params.length) { break; } String mode = add.get(index); switch (mode.toCharArray()[0]) { case 'q': c.addOwner(params[index]); break; case 'a': c.addAdmin(params[index]); break; case 'o': c.addOp(params[index]); break; case 'h': c.addHalfOp(params[index]); break; case 'v': c.addVoice(params[index]); break; default: break; } } for (int index : remove.keySet()) { if (index >= params.length) { break; } String mode = remove.get(index); switch (mode.toCharArray()[0]) { case 'q': c.delOwner(params[index]); break; case 'a': c.delAdmin(params[index]); break; case 'o': c.delOp(params[index]); break; case 'h': c.delHalfOp(params[index]); break; case 'v': c.delVoice(params[index]); break; default: break; } } add = remove = null;