/* Banana-Chat - The first Open Source Knuddels Emulator
 * Copyright (C) 2011 - 2012 Flav <http://banana-coding.com>
 * 
 * Diese Dateien unterliegen dem Coprytight von Banana-Coding und
 * darf verändert, aber weder in andere Projekte eingefügt noch
 * reproduziert werden.
 * 
 * Der Emulator dient - sofern der Client nicht aus Eigenproduktion
 * stammt - nur zu Lernzwecken, das Hosten des originalen Knuddels Clients
 * ist auf eigene Gefahr und verstößt möglicherweise gegen Schutzrechte
 * der Knuddels.de GmbH & Co KG
 * 
 * Autoren: Flav (Grundversion), Localhost (Erweiterte Version), Kokos-Ice (Erweiterte Version)
 */



package netchat;

import java.text.NumberFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import java.io.DataInputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;

import netchat.Settings;
import tools.database.ConnectionPool;
import tools.database.PoolConnection;
import tools.KCodeParser;
import game.WordMixRecord;
import tools.IntegerUtil;
import tools.PacketCreator;
import tools.Pair;
import tools.Password;
import tools.VoteBox;
import tools.popup.Button;
import tools.popup.Label;
import tools.popup.Choice;
import tools.popup.Panel;
import tools.popup.Popup;
import tools.popup.TextArea;
import tools.popup.TextField;

public class CommandParser {

	static Socket socket;
	static DataInputStream in;
	public static PrintStream out;
    private static Random zufall = new Random();
    private static NumberFormat nf;
    private static DecimalFormat df;
    private static String[] afk = {"verschwindet für einen kurzen Moment.", "ist gleich wieder da."};
    private static String[] kiss = {"[C] kann einfach nicht anders und gibt [T] einen langen Kuss.", "[T] kann sich dem Küssen von [C] einfach nicht entziehen.", "[T] wird von [C] ganz fest geknutscht. Wow, jetzt ist aber ein Knutschfleck zurückgeblieben.", "[T] bekommt von [C] einen liebevollen, kleinen Kuss...", "[T] kriegt von [C] einen leichten Bussi.", "[T] wird von [C] herzlich geküsst.", "[T] wird von [C] zärtlich geküsst.", "[C] beugt sich rüber zu [T] und küsst [T] sanft.", "[T] bekommt von [C] einen Bussi aufgedrückt.", "[C] küsst [T] sehr herzlich, sodass [T] nun auf [K] Knutschflecken kommt."};
    private static String[] knuddel = {"[C] °RR°knuddelt°BB° [T] sehr herzlich."};
    private static String[] knuddelz = {"[C] °RR°knuddelt°BB° mal ganz spontan [T] durch... WOW!","[T] werden von [C] so richtig °RR°durchgeknuddelt°BB°.","[C] nimmt [T] in den Arm und °RR°knuddelt°BB° [T] mal so richtig.","Es wird wieder °RR°geknuddelt°BB°! [C] scheint [T] sehr gerne zu haben...","[T] werden Opfer einer °RR°Massenknuddelichung°BB° von [C].","[C] gibt eine ganze Runde °RR°Knuddels°BB° an [T].","[C] °RR°knuddelt°BB° [T] mal so richtig durch."};
    private static String[] unknownUser = {"Wer soll denn bitte %s sein?", "%s ist mir unbekannt.", "%s habe ich hier noch niemals gesehen.", "Keine Ahnung, wen Sie meinen.", "Wer ist %s???", "Tut mir leid, dieser Gast existiert nicht.", "%s gibt's hier leider nicht.", "Ich weiß über %s nichts."};
    private static String[] noKnuddels = {"Knuddeln kann man nur, wenn man auch Knuddels hat, und die fehlen dir leider."};
    private static String[] help = {"%s ist ein sehr gefährlicher Tag.", "Ja, mit %s ist das genau wie mit dem Yeti...", "Mit %s sollte man es aber nicht übertreiben...", "Was ist %s?", "%s ist mir unbekannt."};
    private static String[] messageSent = {"Deine Nachricht wurde an _[N] gesendet_.","[N] wird sich über die Nachricht bestimmt freuen.","Gute Idee, [N] wird sich bestimmt darüber freuen.","Sobald ich [N] wiedersehe, werde ich es ausrichten.","[N] wird es erfahren.","Hoffentlich freut sich [N] über die Nachricht.","Null Problemo, ich werde es [N] ausrichten.","Ich werde es [N] ausrichten.","Wie interessant, ich werde es [N] schnellstmöglich ausrichten.","Ich werde es nicht vergessen und [N] schnellstmöglich ausrichten."};
    
    public static int countChars(String text, char c) {
       int counter = 0;
       
       for (int i=0;i<text.length();i++) {
            if (text.charAt(i) == c) {
            	counter++;
            }
       }

       return counter;
    }
    
    static {
        nf = NumberFormat.getInstance(Locale.GERMAN);
        df = new DecimalFormat("0.00");
    }

    public static String unknownUser(String nick) {
        return String.format(unknownUser[zufall.nextInt(unknownUser.length)], nick);
    }
    
    public static String messageSent(String nick) {
        return messageSent[zufall.nextInt(messageSent.length)].replace("[N]",String.format("°>_h%s|/serverpp \"|/w \"<°", nick.replace("<","\\<")));
    }
    
    public static void highOrLowWrong(Client client, Channel channel, int runde, int points, int zahl) {
		client.sendButlerMessage(channel.getName(), String.format("°RR°_Leider falsch!§ Die neue Zahl ist _°18RR>{textborder}<°%s§.#Du hast es bis zur _%s. Runde_ geschafft (Gewinn: _%s_ Punkte%s).", zahl, client.getHighOrLowRound(), points, client.getHolknuddelsrunde()==1?String.format(" und °BB°_%s Knuddels§", runde>1?runde:0):""));
		
		if(Settings.getHolrunde() < runde) {
			Settings.increaseHoljackpot(1);
			
			channel.broadcastButlerMessage(new StringBuilder().append("°%-1>firework...b.mx_-9.w_52.h_40.gif<° °RR°_").append(client.getName()).append(" hat einen neuen High or Low Rekord aufgestellt! °>firework...b.mx_-9.w_52.h_40.gif<#°").append(client.getGenderLabel()).append(" hat es bis Runde ").append(runde).append(" geschafft. Im Jackpot befinden sich ").append(Settings.getHoljackpot()).append(" Knuddels.").toString());
			channel.setTopic(String.format("In diesem Channel kann High or Low gespielt werden. °>gt.gif<° °BB>Jetzt mitspielen!|/hol start<r°##%s hält den momentanen Rekord mit Runde %s (Jackpot: %s Knuddels).", client.getName(), runde, Settings.getHoljackpot()));

			if(!Settings.getHolnick().equals(client.getName())) {
				Server.get().newMessage(Server.get().getButler(), Settings.getHolnick(), "High or Low Rekord geknackt", String.format("Dein High or Low Rekord wurde soeben von %s mit %s Runden geknacht.", client.getName(), runde), System.currentTimeMillis()/1000);
			}
			
			Settings.setHolrunde(runde);
			Settings.setHolnick(client.getName());
		}
		
		client.setHighOrLowRound((byte)0);
		client.increaseHol(points);

		if(client.getHolknuddelsrunde()==1 && runde >1) {
			client.increaseKnuddels(runde);
			Settings.increaseHoljackpot(1);
		}
		
		client.setHolknuddelsrunde((byte)0);
    }
    
    public static String userIsOffline(Client client) {
    	int seconds = (int) ((System.currentTimeMillis()/1000)-client.getLastOnline());
    	int days = seconds/86400;
    	int hours = seconds/3600;
    	int minutes = seconds/60;
    	String what;
    	
    	if(days > 1) {
    		what = String.format("%s Tagen", days);
    	} else if(days == 1) {
    		what = "einem Tag";
    	} else if(hours > 1) {
    		what = String.format("%s Stunden", hours);
    	} else if(hours == 1) {
    		what = "einer Stunde";
    	} else if(minutes > 1) {
    		what = String.format("%s Minuten", minutes);
    	} else if(minutes == 1) {
    		what = "einer Minute";
    	} else if(seconds > 1) {
    		what = String.format("%s Sekunden", seconds);
    	} else {
    		what = "einer Sekunde";
    	}
    	
        return String.format("°>_h%s|/serverpp \"|/w \"<° ist _seit %s offline_.", client.getName().replace("<", "\\<"), what); 
    }
    
    public static String image(Client client, Client target) {
        if(target.getGender() == 2 && client.getGender() == 2) return "ff";
        else if(target.getGender() == 2 && client.getGender() == 1) return "mf";
        else if(target.getGender() == 1 && client.getGender() == 2) return "fm";
        else return "mm";    
    }

    private static List<Pair<String, Integer>> icons;

    public static void addIcon(String icon, int size, Client nick, Channel channel) {
        Pair<String, Integer> pair = new Pair<String, Integer>(icon, size);

        icons = new ArrayList<Pair<String, Integer>>();
        icons.add(pair);
        
        if(channel == null) {
        	for (Channel channelz : nick.getChannels()) {
            	for (Client target : channelz.getClients()) {
            		if(target != Server.get().getButler()) {
            			target.send(PacketCreator.addIcon(channelz.getName(), nick.getName(), pair));
            		}
            	}
        	}
        } else {
            for (Client target : channel.getClients()) {
            	if(target != Server.get().getButler()) {
            		target.send(PacketCreator.addIcon(channel.getName(), nick.getName(), pair));
            	}
            }
        }
    }
    
    public static void removeIcon(String icon, String name, Channel channel) {
    	Client nick = Server.get().getClient(name);
    	
    	if(channel == null) {
    		for (Channel channelz : nick.getChannels()) {
    			for (Client target : channelz.getClients()) {
    				if(target != Server.get().getButler()) {
            			target.send(PacketCreator.removeIcon(channelz.getName(), nick.getName(), icon));
            		}
            	}
        	}
        } else {
    		for (Client target : channel.getClients()) {
    			if(target != Server.get().getButler() && nick != null) {
            		target.send(PacketCreator.removeIcon(channel.getName(), nick.getName(), icon));
            	}
        	}
        }
    }
    
    public static boolean muted(Client client, Channel channel) {
    	return Server.get().checkCcm(client.getName(), channel, 3);
    }
    
    public static boolean moderated(Client client, Channel channel) {
    	return channel.isModerated() && !channel.checkMod(client.getName()) && !channel.checkVip(client.getName()) && !client.hasPermission("eventwrite");
    }
    
    
    @SuppressWarnings({ "deprecation" })
	public static void parse(String message, Client client, Channel channel, boolean fromGame) {
        String command = KCodeParser.escape(message.substring(1).split(" ")[0]);
        String cmd = command.toLowerCase();
        String arg = "";
        Long time = System.currentTimeMillis()/1000; 
        
        if (message.length() > cmd.length() + 1) {
            arg = message.substring(message.indexOf(' ') + 1);
        }

        int Anzahlspe = Server.countChars(arg, '°');
        
        if (Anzahlspe == 1) {
        	String[] argus = arg.split("°", 2);
        	arg = argus[0];
        }
        
        if(cmd.equals("beta")) {
        	client.sendButlerMessage(channel.getName(), "Du kannst momentan kein Feedback zu Cuddlychat abgeben.");
        } else if(cmd.equals("thiefgame")) {
        	if(!client.hasPermission("cmd.thiefgame")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	Popup popup = new Popup("ThiefGame", null, String.format("°>{imageboxstart}boxS.my_-4.mh_30<°#°20+0015+9515°_ThiefGame°b° °12+0000°##°+5040°°+9505°°+0020°Punkte: %s##°>%sthiefgame?id=%s|\"<°##°>{imageboxend}<°##°>LEFT<°##°>center<°°16>{button}OK||call|_c|width|70|heigth|28<°", client.getThiefGame(), Server.get().getURL(), client.getName()), 450, 300);
        	popup.setDesign(2);
        	client.send(popup.toString());
        } else if(cmd.equals("email")) {
        	if(!client.hasPermission("cmd.email")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}

            String nickname = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            
            if (arg.length() > nickname.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            client.send(PacketCreator.createEmailWindow(nickname, msg));
        } else if(cmd.equals("openurl")) {
        	if(!client.hasPermission("cmd.openurl")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	client.send(PacketCreator.openURL(arg, "_blank"));
        } else if(cmd.equals("hz")) {
        	if(!client.hasPermission("cmd.hz")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	arg = KCodeParser.escape(arg);
        	
        	if(arg.isEmpty()) {
        		StringBuilder hze = new StringBuilder("°B°_");
        		String title = "HZ-Editor - Übersicht";
        		
        		for(Channel c : Server.get().getChannels()) {
        			if(c.getTemp() == 0) {
        				hze.append("°>").append(c.getName()).append("|/hz \"<°#");
        			}
        		}
        		
        		client.send(Popup.create(title, title, hze.toString(), 400, 250));
        		return;
        	}
        	
        	Channel target = Server.get().getChannel(arg);
        	
        	if(target == null) {
        		client.sendButlerMessage(channel.getName(), String.format("Der Channel _%s existiert nicht_.", arg));
        		return;
        	}
        	
        	client.send(PacketCreator.createHZEditorWindow(target.getName(), target.getHZ().replace("||", ", ").replace("|", "")));
        } else if(cmd.equals("like")) {
        	if(!client.hasPermission("cmd.like")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	arg = KCodeParser.noKCode(arg);
        	int argLength = arg.length();
        	
        	if(arg.isEmpty()) {
        		client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/like TEXT oder !#(TEXT mögen oder TEXT aus dem Profil löschen.)");
        		return;
        	}
        	
        	if(arg.equals("!")) {
        		client.sendButlerMessage(channel.getName(), "Profileintrag gelöscht.");
        		client.setLike(null);
        		return;
        	}
        	
        	if(argLength > 50) {
        		client.sendButlerMessage(channel.getName(), "Der Text darf höchstens 50 Zeichen lang sein.");
        		return;
        	}
        	
        	arg = Server.get().parseSmileys(client, arg);
        	
        	channel.broadcastPicAction(">", String.format("%s mag °RR°_%s°r°_.", client.getName(), arg), "iconslike.gif");
        	client.setLike(arg);
        } else if(cmd.equals("action")) {
        	if(!client.hasPermission("cmd.action")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	if(arg.isEmpty()) {
        		client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/action TEXT#(Manipuliert eine Aktion mit dem vorgegebenen TEXT im aktuellen Channel.)");
        		return; 
        	}
        	
        	channel.broadcastAction(">", Server.get().parseSmileys(client, arg));
        } else if(cmd.equals("ok")) {
        	if(!client.hasPermission("cmd.ok")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	arg = KCodeParser.escape(arg);
        	
        	for(int x : Server.invite.keySet()) {
        		String[] split = Server.invite.get(x);
        		String an = split[0];
        		String vo = split[1];
        		Client von = Server.get().getClient(vo);
        		String design = split[2];
        		//String test = split[3];
        		int butler = Integer.parseInt(split[4]);
        		String name = split[5];
        		String topic = split[6];
        		boolean online = true;
        		
        		if(von == null) {
        			online = false;
        			von = new Client(null);
        			von.loadStats(vo);
        		}
        		
        		if(an.equals(client.getName())) {
        			if(!online) {
        				client.sendButlerMessage(channel.getName(), String.format("%s ist offline.", von.getName()));
        			} else {
        				String channelName = String.format("/Separee %s - %s", x, name);
        				Server.get().createChannel(channelName, 1, client.getName(), butler, design, topic);
        				Channel channelTo = Server.get().getChannel(channelName);

        				client.joinChannel(channelTo);
        	            channel.leave(client);
        	            client.leaveChannel(channel);
        	            client.send(PacketCreator.switchChannel(channel.getName(), channelTo.getName()));
        	            client.send(PacketCreator.updateChannelSettings(channelTo));
        	            client.send(PacketCreator.updateChannelBackground(channelTo));
        	            channelTo.join(client);    
        	            
        	            von.joinChannel(channelTo);
        	            von.send(PacketCreator.channelFrame(channelTo, von.getName()));
        	            channelTo.join(von);  
        			}
        			
        			channel.broadcastAction(">", String.format("%s und %s ziehen sich in ihre Privatgemächer zurück.", von.getName(), client.getName()));
        			
        			Server.invite.remove(x);
        			return;
        		}
        		
        		return;
        	}
        	
        	client.sendButlerMessage(channel.getName(), "Falscher Parameter.");
        } else if(cmd.equals("nvote")) {
        	if(!client.hasPermission("cmd.nvote")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	String[] split = arg.split("\\|");
        	Channel c = Server.get().getChannel(split[1]);
        	
        	if(c == null) {
        		return;
        	}
        	
        	StringBuilder vote = new StringBuilder();
        	vote.append("k\0");
        	vote.append("Befragung");
        	vote.append("õfÿÿÿh\0\0\0ãEl  õcgMh\0\0\0ãWl  õcgMh\0\0\0ãSl õcgFh\0\0\0ãNl õcgFh\0\0\0ãCpBNpBCl");
        	vote.append("Befragung");
        	vote.append("õblgSfÀÀÀh@@@ãSl õcgFh\0\0\0ããCc");
        	vote.append(split[0]);
        	vote.append("õs^\0dfÿÿÿh\0\0\0ãSpBNpFpGDBFFb");
        	int bla = 0;
        	for(String answer : channel.newVoteAnswers.keySet()) {
        		vote.append(answer);
        		vote.append("õcdba:fct:/sfc ");
        		vote.append(split[1]);
        		vote.append(":/fw ");
        		vote.append(answer);
            	vote.append("õgRfÿÿÿh\0\0\0ä");
            	vote.append(bla==channel.newVoteAnswers.size()-1?"ã":"b");
            	bla++;
        	}
        	
        	vote.append("ãCl õcgIh\0\0\0ãSpFbAbbrechenõcdbgRfÿÿÿh\0\0\0ããããã");
        	
        	// Ende: ã statt b
        	client.send(vote.toString());
        } else if(cmd.equals("fw")) {
        	if(!client.hasPermission("cmd.fw")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	if(!channel.newVoteAnswers.containsKey(arg)) {
        		return;
        	}
        	
        	if(channel.newVoteNicks.contains(client.getName())) {
        		client.sendButlerMessage(channel.getName(), "Du hast bereits gevotet.");
        		return;
        	}
        	
        	channel.newVoteNicks.add(client.getName());
        	channel.newVoteAnswers.put(arg, channel.newVoteAnswers.get(arg)+1);
        	
        	for (Client c : channel.getClients()) {
        		c.send(VoteBox.updateVoteBox(channel.getName(), arg, 1, String.format("%s wählt %s", client.getName(), arg)));
        	}
        	
        	if(channel.getNewVoteUser() == channel.newVoteNicks.size()) {
        		VoteBox.newVoteResult(channel);
        	}
        } else if(cmd.equals("newvote")) {
        	if(!client.hasPermission("cmd.newvote")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	String[] split = arg.split("\\|");
        	String error = "Verwende den Befehl wie folgt:#/newvote BESCHREIBUNG|SEKUNDEN|WAHL 1|WAHL2|...|WAHL N";
        	
        	if(arg.isEmpty()) {
        		client.sendButlerMessage(channel.getName(), error);
        		return;
        	}
        	
        	try {
        		Integer.parseInt(split[1]);
        	} catch (Exception ex) {
        		client.sendButlerMessage(channel.getName(), error);
        		return;
        	}
        	
        	int length = split.length;
        	int zeit = Integer.parseInt(split[1]);
        	
        	if(length < 4 || length > 12) {
        		client.sendButlerMessage(channel.getName(), "Du musst zwischen 2 und 10 Wahlmöglichkeiten angeben.");
        		return;
        	}

        	if(zeit > 300) {
        		client.sendButlerMessage(channel.getName(), "Die Befragungszeit kann _maximal 300 Sekunden_ betragen.");
        		return;
        	}
        	
        	if(zeit < 1) {
        		zeit = 30;
        	} 
        	
        	/*if(channel.getNewVoteEnd() != 0) {
        		client.sendButlerMessage(channel.getName(), "In diesem Channel wird die Votebox leider schon verwendet.");
        		return;
        	}*/
        	
        	int min = 0;
        	String question = KCodeParser.noKCode(split[0]);
        	
        	for(String answer : split) {
        		if(min > 1) {
        			channel.newVoteAnswers.put(answer, 0);
        		}
        		
        		min++;
        	}
        	
        	for(Client c : channel.getClients()) {
        		c.send(VoteBox.createVoteBox(channel, "Befragung", new VoteBox.Button("Vote", "1.gif", String.format("/nvote %s|%s", question, channel.getName()), true), channel.newVoteAnswers, zeit));
        	}
        	
        	channel.broadcastButlerMessage(String.format("°20°_Es findet eine Befragung statt:_°r°##°+0080°_%s_°%%00°##Gib jetzt deine Meinung ab.", question));
        	channel.setNewVoteEnd(time+zeit);
        	channel.setNewVoteUser(channel.countClients()-1);
        } else if(cmd.equals("invite")) {
        	if(!client.hasPermission("cmd.invite")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	arg = KCodeParser.escape(arg);
        	
        	if(arg.isEmpty()) {
        		client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/invite NICK#(Mit dieser Funktion läd man NICK in ein Separee ein)");
        		return;
        	}	        
        	
        	Client target = Server.get().getClient(arg);
        	boolean online = true;
        	
        	if(target == null) {
        		online = false;
        		target = new Client(null);
        		target.loadStats(arg);
        		
        		if(target.getName() == null) {
        			client.sendButlerMessage(channel.getName(), unknownUser(arg));
        			return;
        		}
        	}
        	
        	if(!online) {
        		client.sendButlerMessage(channel.getName(), userIsOffline(target));
        		return;
        	}
        	
        	if(target == Server.get().getButler() || target == client) {
        		client.sendButlerMessage(channel.getName(), String.format("%s kann nicht in ein Separee eingeladen werden.", target.getName()));
        		return;
        	}
        	
        	client.send(PacketCreator.createInviteWindow(target.getName(), "", String.format("%s & %s", target.getName(), client.getName())));
       
        
                
                } else if(cmd.equals("ok")) {
                
                
                
                
               } else if(cmd.equals("loveletter")) {
                   if (!client.checkCode(98) && !client.hasPermission("cmd.loveletter")) {
                       
                   }

        		String msg = "";
        	    String[] lols = arg.split(":", 2);
        	    int split2 = arg.indexOf(':');
        	    String art = lols[0];
        	    if (split2 >= 0) {
        	      msg = lols[1];
        	    }

        	    if (art.equals("answer")) {
        	      if ((msg.equals("1")) || (msg.equals("2")) || (msg.equals("3")))
        	      {
        	        String von = "";
        	        String id = "";
        	        String art2 = "";
        	        PoolConnection pcon0 = ConnectionPool.getConnection(); PreparedStatement ps0 = null;
        	        try { Connection con0 = pcon0.connect(); ps0 = con0.prepareStatement("SELECT * FROM acts WHERE act LIKE 'loveletter|%' and an='" + client.getName() + "' order by id desc limit 1"); for (ResultSet rs0 = ps0.executeQuery(); rs0.next(); ) {
        	            id = rs0.getString("id");
        	            von = rs0.getString("von");
        	            art2 = rs0.getString("act");
        	          }
        	        }
        	        catch (SQLException e)
        	        {
        	          e.printStackTrace(); } finally { if (ps0 != null) try { ps0.close(); } catch (SQLException e) {
        	            } pcon0.close();
        	        }
        	        if (von.isEmpty()) {
        	          client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        	          return;
        	        }

        	        String nicknamen = KCodeParser.escape(von);
        	        Client target = Server.get().getClient(nicknamen);
        	        if (target == null) {
        	          target = new Client(null);
        	          target.loadStats(nicknamen);
        	        }

        	        String[] arts = art2.split("\\|");
        	        String text = "";
        	        if (msg.equals("1"))
        	          text = "_°BB>_h" + client.getName() + "|/serverpp " + client.getName() + "|/w " + client.getName() + "<°°r°_ hat zugestimmt. _°BB>_h" + target.getName() + "|/serverpp " + target.getName() + "|/w " + target.getName() + "<°°r°_ und _°BB>_h" + client.getName() + "|/serverpp " + client.getName() + "|/w " + client.getName() + "<°°r°_ gehen nun miteinander!°#°°#°";
        	        else if (msg.equals("2"))
        	          text = "_°BB>_h" + client.getName() + "|/serverpp " + client.getName() + "|/w " + client.getName() + "<°°r°_ hat _°BB>_h" + target.getName() + "|/serverpp " + target.getName() + "|/w " + target.getName() + "<°°r°_ leider einen Korb gegeben.°#°°#°";
        	        else if (msg.equals("3")) {
        	          text = "_°BB>_h" + client.getName() + "|/serverpp " + client.getName() + "|/w " + client.getName() + "<°°r°_ muss erst nochmal über die Frage von _°BB>_h" + target.getName() + "|/serverpp " + target.getName() + "|/w " + target.getName() + "<°°r°_ nachdenken.°#°°#°";
        	        }

        	        String bild = "";
        	        if (arts[1].equals("classic")) {
        	          if (msg.equals("1"))
        	            bild = "°>abo/loveletter_classic_bg...h_177.png<°°#°°+9177>abo/loveletter_classic_over...h_177.gif<°°#°°+913012+0063° °#°°>abo/loveletter_classic_option.png<°°#°°>abo/loveletter_option_trans.gif<°°#°°>abo/loveletter_option_trans.gif<°°#° °#° °#°°+0000r°";
        	          else if (msg.equals("2"))
        	            bild = "°>abo/loveletter_classic_bg...h_177.png<°°#°°+9177>abo/loveletter_classic_over...h_177.gif<°°#°°+913012+0063° °#°°>abo/loveletter_option_trans.gif<°°#°°>abo/loveletter_classic_option.png<°°#°°>abo/loveletter_option_trans.gif<°°#° °#° °#°°+0000r°";
        	          else if (msg.equals("2"))
        	            bild = "°>abo/loveletter_classic_bg...h_177.png<°°#°°+9177>abo/loveletter_classic_over...h_177.gif<°°#°°+913012+0063° °#°°>abo/loveletter_option_trans.gif<°°#°°>abo/loveletter_option_trans.gif<°°#°°>abo/loveletter_classic_option.png<°°#° °#° °#°°+0000r°";
        	        }
        	        else if (arts[1].equals("rude")) {
        	          if (msg.equals("1"))
        	            bild = "°>abo/loveletter_rude_bg...h_179.png<°°#°°+9179>abo/loveletter_rude_over...h_179.gif<°°#°°+913112+0092° °#°°>abo/loveletter_rude_option.png<°°#°°>abo/loveletter_option_trans.gif<°°#°°>abo/loveletter_option_trans.gif<°°#° °#° °#°°+0000r°";
        	          else if (msg.equals("2"))
        	            bild = "°>abo/loveletter_rude_bg...h_179.png<°°#°°+9179>abo/loveletter_rude_over...h_179.gif<°°#°°+913112+0092° °#°°>abo/loveletter_option_trans.gif<°°#°°>abo/loveletter_rude_option.png<°°#°°>abo/loveletter_option_trans.gif<°°#° °#° °#°°+0000r°";
        	          else if (msg.equals("3"))
        	            bild = "°>abo/loveletter_rude_bg...h_179.png<°°#°°+9179>abo/loveletter_rude_over...h_179.gif<°°#°°+913112+0092° °#°°>abo/loveletter_option_trans.gif<°°#°°>abo/loveletter_option_trans.gif<°°#°°>abo/loveletter_rude_option.png<°°#° °#° °#°°+0000r°";
        	        }
        	        else if (arts[1].equals("timid")) {
        	          if (msg.equals("1"))
        	            bild = "°>abo/loveletter_timid_bg...h_176.png<°°#°°+9176>abo/loveletter_timid_over...h_176.gif<°°#°°+912212+0051° °#°°>abo/loveletter_timid_option.png<°°#°°>abo/loveletter_option_trans.gif<°°#°°>abo/loveletter_option_trans.gif<°°#° °#° °#°°+0000r°";
        	          else if (msg.equals("2"))
        	            bild = "°>abo/loveletter_timid_bg...h_176.png<°°#°°+9176>abo/loveletter_timid_over...h_176.gif<°°#°°+912212+0051° °#°°>abo/loveletter_option_trans.gif<°°#°°>abo/loveletter_timid_option.png<°°#°°>abo/loveletter_option_trans.gif<°°#° °#° °#°°+0000r°";
        	          else if (msg.equals("3")) {
        	            bild = "°>abo/loveletter_timid_bg...h_176.png<°°#°°+9176>abo/loveletter_timid_over...h_176.gif<°°#°°+912212+0051° °#°°>abo/loveletter_option_trans.gif<°°#°°>abo/loveletter_option_trans.gif<°°#°°>abo/loveletter_timid_option.png<°°#° °#° °#°°+0000r°";
        	          }
        	        }
        	        String ausgabe = text + bild;
        	        channel.broadcastMessage(ausgabe, Server.get().getButler(), false);

        	        client.setZusammen(target.getName());
        	        target.setZusammen(client.getName());
        	        Server.get().query("delete from acts where id='" + id + "'");
        	      }

        	      return;
        	    }

        	    if (arg.isEmpty()) {
        	      client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/loveletter NICK oder !#(Mit NICK zusammen sein, ! zum löschen)");
        	      return;
        	    }

        	    if (arg.equals("!")) {
        	      if (client.getZusammen().isEmpty()) {
        	        client.sendButlerMessage(channel.getName(), "Du bist derzeit mit niemanden zusammen.");
        	      } else {
        	        client.sendButlerMessage(channel.getName(), "Du bist nun mit niemanden zusammen.");
        	        client.setZusammen("");
        	      }
        	      return;
        	    }
        	    
        	    if (!client.checkCode(98) && !client.hasPermission("cmd.loveletter")) {
        			client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        			return;
        		}

        	    if ((art.equals("timid")) || (art.equals("rude")) || (art.equals("classic")))
        	    {
        	      String nicknamen2 = KCodeParser.escape(msg);
        	      boolean online2 = true;
        	      Client target2 = Server.get().getClient(nicknamen2);
        	      if (target2 == null) {
        	        online2 = false;
        	        target2 = new Client(null);
        	        target2.loadStats(nicknamen2);
        	      }
        	      nicknamen2 = target2.getName();

        	      if (nicknamen2 == null) {
        	        client.sendButlerMessage(channel.getName(), CommandParser.unknownUser(msg));
        	        return;
        	      }

        	      if (target2.getName().equals(client.getName())) {
        	        client.sendButlerMessage(channel.getName(), "Du kannst doch nicht mit dir selbst zusammen sein.");
        	        return;
        	      }

        	      if (!online2) {
        	        client.sendButlerMessage(channel.getName(), CommandParser.userIsOffline(target2));
        	        return;
        	      }

        	      if (target2.getName().equals(Server.get().getButler().getName())) {
        	        client.sendButlerMessage(channel.getName(), "Mit " + Server.get().getButler().getName() + " kannst du nicht zusammen sein.");
        	        return;
        	      }

        	      if (!channel.getClients().contains(target2)) {
        	        client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° hält sich im Moment _in einem anderen Channel_ auf.", new Object[] { target2.getName() }));
        	        return;
        	      }

        	      channel.broadcastMessage("_°BB>_h" + client.getName() + "|/serverpp " + client.getName() + "|/w " + client.getName() + "<°°°_ schiebt einen kleinen Zettel zu _°BB>_h" + target2.getName() + "|/serverpp " + target2.getName() + "|/w " + target2.getName() + "<°°°_ hinüber!", Server.get().getButler(), false);

        	      if (art.equals("timid"))
        	        target2.sendButlerMessage(channel.getName(), "_°BB>_h" + client.getName() + "|/serverpp " + client.getName() + "|/w " + client.getName() + "<°°r°_ schiebt dir diesen Zettel herüber:##°>abo/loveletter_timid_bg...h_176.png<°#°+9176>abo/loveletter_timid_over...h_176.gif<°#°+912212+0051° #°>abo/loveletter_option_trans.gif|abo/loveletter_timid_option.png<>|/loveletter answer:1<°#°>abo/loveletter_option_trans.gif|abo/loveletter_timid_option.png<>|/loveletter answer:2<°#°>abo/loveletter_option_trans.gif|abo/loveletter_timid_option.png<>|/loveletter answer:3<°# # #°+0000r°");
        	      else if (art.equals("rude"))
        	        target2.sendButlerMessage(channel.getName(), "_°BB>_h" + client.getName() + "|/serverpp " + client.getName() + "|/w " + client.getName() + "<°°r°_ schiebt dir diesen Zettel herüber:##°>abo/loveletter_rude_bg...h_179.png<°#°+9179>abo/loveletter_rude_over...h_179.gif<°#°+913112+0100° #°>abo/loveletter_option_trans.gif|abo/loveletter_rude_option.png<>|/loveletter answer:1<°#°>abo/loveletter_option_trans.gif|abo/loveletter_rude_option.png<>|/loveletter answer:2<°#°>abo/loveletter_option_trans.gif|abo/loveletter_rude_option.png<>|/loveletter answer:3<°# # #°+0000r°");
        	      else if (art.equals("classic")) {
        	        target2.sendButlerMessage(channel.getName(), "_°BB>_h" + client.getName() + "|/serverpp " + client.getName() + "|/w " + client.getName() + "<°°r°_ schiebt dir diesen Zettel herüber:##°>abo/loveletter_classic_bg...h_177.png<°°#°°+9177>abo/loveletter_classic_over...h_177.gif<°#°+913012+0063° °#°°>abo/loveletter_option_trans.gif|abo/loveletter_classic_option.png<>|/loveletter answer:1<°°#°°>abo/loveletter_option_trans.gif|abo/loveletter_classic_option.png<>|/loveletter answer:2<°°#°°>abo/loveletter_option_trans.gif|abo/loveletter_classic_option.png<>|/loveletter answer:3<°°#° °#° °#°°+0000r°");
        	      }

        	      Server.get().query("insert into acts set von='" + client.getName() + "', an='" + target2.getName() + "', channel='" + channel.getName() + "', time='" + System.currentTimeMillis() / 1000L + "',act='loveletter|" + art + "'");

        	      return;
        	    }

        	    String nicknamen = KCodeParser.escape(arg);
        	    boolean online = true;
        	    Client target = Server.get().getClient(nicknamen);
        	    if (target == null) {
        	      online = false;
        	      target = new Client(null);
        	      target.loadStats(nicknamen);
        	    }
        	    nicknamen = target.getName();

        	    if (nicknamen == null) {
        	      client.sendButlerMessage(channel.getName(), CommandParser.unknownUser(arg));
        	      return;
        	    }

        	    if (target.getName().equals(client.getName())) {
        	      client.sendButlerMessage(channel.getName(), "Du kannst doch nicht mit dir selbst zusammen sein.");
        	      return;
        	    }

        	    if (!online) {
        	      client.sendButlerMessage(channel.getName(), CommandParser.userIsOffline(target));
        	      return;
        	    }
        	    if (target.getName().equals(Server.get().getButler().getName())) {
        	      client.sendButlerMessage(channel.getName(), "Mit " + Server.get().getButler().getName() + " kannst du nicht zusammen sein.");
        	      return;
        	    }

        	    if (!channel.getClients().contains(target)) {
        	      client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° hält sich im Moment _in einem anderen Channel_ auf.", new Object[] { target.getName() }));
        	      return;
        	    }

        	    client.sendButlerMessage(channel.getName(), String.format("Wie willst du den Liebesbrief schreiben?#_°BB>_hKlassisch|/loveletter classic:%s<°_°°,\t _°BB>_hAufreißerisch|/loveletter rude:%s<°_°° oder _°BB>_hSchüchtern|/loveletter timid:%s<°°°_", new Object[] { target.getName(), target.getName(), target.getName() }));
        	

        
                    
                    
        } else if (cmd.equals("deletemynick")) {
             
String title = "Sicherheitsfrage - Benutzerkonto";
String content = "°14+0006+9505°_Nickname wirklich löschen?_#°+9510+0000>{table|8|8|180|8|8|w1}<°°>{tc}<[203,203,255]>{colorboxstart}<K°°>{tc}<11+9508°°14°Sind sie sich sicher das sie ihr vorhandendes Benutzerkonto auflösen und löschen wollen?#Die Vorhandenen Knuddels, Smileys und Feature sowie Einträge & Statistiken gehen dabei verloren#Sind sie sich sicher?..°>{tc}<>transparent1x1...w_0.h_115.gif<[203,203,255]>{colorboxend}<K°°>{tc}<>{tc}<>center<>sm_maumau_blowCards_001...b.my_7.h_26.gif<>transparent1x1...b.w_0.h_50.gif<°#°+9510>left<>smileybox/line2...mw_90.png<°#°+9510>bullet2.png<°#°+9510>bullet2.png<°°>{endtable}<°##°11+9505>center<°_°>{button}Konto löschen||call|/deletenick|heigth|24<°_  _°>{button}Abbrechen||call|_c|width|70|heigth|24<°_";


                Popup fiftyPopup = new Popup(title, title, content, 350, 300);

                Panel panel = new Panel();
                

                fiftyPopup.addPanel(panel);
                client.send(fiftyPopup.toString());
    
         
        
           } else if (cmd.equals("deletenick")) {     
                
                
            client.logout("Ausgeloggt. - Nickname zur Löschung freigegeben!");
            
           
         {
                		client.setDeletenick(1);
                	
                		Server.get().query(String.format("update accounts set deletenick='%s' where name='%s'", 1, client.getName()));
                	}
                	
                	return;
            
            
           }
                
                
                
         else if (cmd.equals("nsay")) {
             if (!client.hasPermission("cmd.nsay")) {
             }

            
          

            int split = arg.indexOf(':');
         

            if (split < 1 || split == arg.length() - 1) { // ungÃ¼ltige syntax
                client.sendButlerMessage(channel.getName(), "Die Funktion bitte wie folgt benutzen: /m NICK:Nachricht");
                return;

            }
            {



                String nickname = KCodeParser.escape(arg.substring(0, split));
                Client target = Server.get().getClient(nickname);


                String m = arg.substring(split + 1);

                channel.broadcastAction("°>_h" + nickname + "|/serverpp \"|/w \"<°" + ":", m);


 
            }  
         }        
                    
                    
            else if(cmd.equals("kdice") || cmd.equals("kd")) {
try{
String[] pieces = arg.split(":");
if(arg.equals("") || pieces.length != 3){
client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/kdice [USER]:[ANZAHL]w[AUGENZAHL]:[KNUDDEL]");
return;
}

String userName = pieces[0];
String dice = pieces[1];
int kAnz = Integer.parseInt(pieces[2]);

if(kAnz <= 0) {
client.sendButlerMessage(channel.getName(), "Anzahl muss positiv sein!");
return;
}

if(client.getKnuddels() < kAnz) {
client.sendButlerMessage(channel.getName(), "Du besitzt leider im Moment nicht genügend Knuddels!");
return;
}

Client c = Server.get().getClient(userName);

if (c == null) {
client.sendButlerMessage(channel.getName(), arg + " ist mir unbekannt.");
} else {
if(c.getName().equals(client.getName())) {
client.sendButlerMessage(channel.getName(), "Du kannst nicht mit dir selbst spielen!");
return;
}
if(c.getChannel() != client.getChannel()) {
client.sendButlerMessage(channel.getName(), "Dein Partner befindet sich in einem anderen Channel!");
return;
}
if(c.getKnuddels() < kAnz) {
client.sendButlerMessage(channel.getName(), "Dein Partner besitzt leider im Moment nicht genügend Knuddels!");
return;
}

c.setDiceUser(client, kAnz, dice);
client.sendButlerMessage(channel.getName(), "°>_h" + c.getName() + "|/serverpp \"|/w \"<° wurde benachrichtigt!");
c.sendButlerMessage(channel.getName(),
"°BB°°>_h" + client.getName() +
"|/serverpp \"|/w \"<° bietet dir eine Runde °RR22°_Dicen_§°BB° an. _(" +
kAnz +
" Knuddels, " +
dice +
") " +
"°>{button} Mitspielen ||call|/okay " +
c.getDiceID() +
"<°"
);
}

}catch(Exception ex){
client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/kdice [USER]:[ANZAHL]w[AUGENZAHL]:[KNUDDEL]");
}
} else if(cmd.equals("okay")) {
try {
int id = Integer.parseInt(arg);
if(client.getDiceID() == id) {

if(client.getDiceUser() == null) {
client.sendButlerMessage(channel.getName(), "Dein KDice-Partner befindet sich mitlerweile offline!");
return;
}

String dice1 = IntegerUtil.dice(client.getDice());
String dice2 = IntegerUtil.dice(client.getDice());

int ges1 = Integer.parseInt(dice1.substring(dice1.indexOf('=') + 1).trim());
int ges2 = Integer.parseInt(dice2.substring(dice2.indexOf('=') + 1).trim());

Client winner = ges1 > ges2 ? client : client.getDiceUser();
Client loser = ges1 > ges2 ? client.getDiceUser() : client;

String msg1 = PacketCreator.action(">", channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° rollt einen Würfel...#%s", client.getName(), dice1));
String msg2 = PacketCreator.action(">", channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° rollt einen Würfel...#%s", client.getDiceUser().getName(), dice2));

String msg3 = "";
if(ges1 != ges2) {
msg3 = PacketCreator.action(">", channel.getName(),
String.format(
"Das Spiel Dicen gewann _°>_h%s|/serverpp \"|/w \"<°_. Der Gewinn in Höhe von _%s Knuddels_ wurde soeben ausgezahlt.",
winner.getName(),
client.getDiceCount(),
loser.getName()
)
);

winner.increaseKnuddels(client.getDiceCount());
loser.decreaseKnuddels(client.getDiceCount());
} else {
msg3 = PacketCreator.action(">", channel.getName(),
String.format(
"Die KDice-Runde zwischen °>_h%s|/serverpp \"|/w \"<° und °>_h%s|/serverpp \"|/w \"<° geht Remis aus und jeder behält seinen Einsatz von _%s Knuddels_",
winner.getName(),
loser.getName(),
client.getDiceCount()
)
);
}
client.setDiceUser(client, 0, "");

for (Client cl : channel.getClients()) {
cl.send(msg1);
cl.send(msg2);
cl.send(msg3);
}
}
} catch (NumberFormatException nfe) {
} catch (Exception ex) { }
 
        
    
                    
                    
                    
                    
        
        } else if(cmd.equals("holdhands")) {
        	    if (arg.equals("okay")) {
        	    	for (long x : Server.actions.keySet()) {
                    	String[] split = Server.actions.get(x);
                    	Channel cha = Server.get().getChannel(split[3]);
                    	String typ = split[0];
                    	String v = split[1];
                    	Client von = Server.get().getClient(v);
                    	Client an = Server.get().getClient(split[2]);
                    	
                    	if(cha == channel && an == client && v.equals(arg) && typ.equals("holdhands")) {
                    		channel.broadcastPicAction(">>", String.format("°>_h%s|/serverpp \"<° hält nun mit °>_h%s|/serverpp \"|/w \"<° Händchen!", von.getName().replace("<", "\\<"), client.getName().replace("<", "\\<")), String.format("actKizz_ani-bg...h_20.my_3.png<>icons/actKizz_%s_ani...h_20.mx_-40.w_0.my_3.gif<>transparent1x1...w_0.gif", image(von, client)));
                           
                    		if(von != null) {
                    			von.setHoldHands(String.format("%s|%s|", von.getHoldHands(), client.getName()));
                    		}
                    		
                    		an.setHoldHands(String.format("%s|%s|", an.getHoldHands(), v));
                    		
                    		Server.actions.remove(x);
                    		break;
                    	}
                    }
        	    	
        	    	return;
        	    }
        	    
            	if (arg.isEmpty()) {
            	      client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/holdhands NICK#(Mit NICK Händchen halten.)");
            	      return;
            	} 
            	
        	      String nicknamen = KCodeParser.escape(arg);
        	      boolean online = true;
        	      Client target = Server.get().getClient(nicknamen);
        	      if (target == null) {
        	        online = false;
        	        target = new Client(null);
        	        target.loadStats(nicknamen);
        	      }
        	      nicknamen = target.getName();

        	      if (arg.isEmpty()) {
        	        client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/holdhands NICK#(Mit NICK händchenhalten)");
        	        return;
        	      }

        	      if (nicknamen == null) {
        	        client.sendButlerMessage(channel.getName(), unknownUser(arg));
        	        return;
        	      }

        	      if (target.getName().equals(client.getName())) {
        	        client.sendButlerMessage(channel.getName(), "Du kannst doch nicht mit dir selbst Händchenhalten");
        	        return;
        	      }

        	      if (!online) {
        	        client.sendButlerMessage(channel.getName(), userIsOffline(target));
        	        return;
        	      }
        	      /*if (client.holdHands.contains(target.getName())) {
        	        client.sendButlerMessage(channel.getName(), "Mit " + target.getName() + " hast du bereits Händchen gehalten.");
        	        return;
        	      }*/
        	      if (target.getName().equals(Server.get().getButler().getName())) {
        	        client.sendButlerMessage(channel.getName(), "Mit " + Server.get().getButler().getName() + " kannst du nicht Händchenhalten.");
        	        return;
        	      }

        	      if (!channel.getClients().contains(target)) {
        	        client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° hält sich im Moment _in einem anderen Channel_ auf.", new Object[] { target.getName() }));
        	        return;
        	      }

        	      client.sendButlerMessage(channel.getName(), String.format("%s wird sich jetzt entscheiden, deine Hand zu halten oder es bleiben zu lassen...", new Object[] { target.getName() }));
        	      target.sendButlerMessage(channel.getName(), String.format("_°BB20°_Herzklopfen angesagt:_°r°#_°>_h" + client.getName() + "|/serverpp " + client.getName() + "|/w " + client.getName() + "<°_ möchte mit dir _Händchenhalten_... reichst du deine Hand? _°>{button} Bestätigen ||call|/holdhands okay<° _", new Object[0]));
        	      
        	      Server.actions.put(time, new String[] {"holdhands", client.getName(), target.getName(), channel.getName(), "60"});
        } else if(cmd.equals("highfive")) {
        	if (arg.equals("okay")) {
        		for (long x : Server.actions.keySet()) {
                	String[] split = Server.actions.get(x);
                	Channel cha = Server.get().getChannel(split[3]);
                	String typ = split[0];
                	String v = split[1];
                	Client von = Server.get().getClient(v);
                	Client an = Server.get().getClient(split[2]);
                	
                	if(cha == channel && an == client && v.equals(arg) && typ.equals("highfive")) {
                		channel.broadcastPicAction(">>", String.format("°>_h%s|/serverpp \"<° schlägt in die Hand von °>_h%s|/serverpp \"|/w \"<° ein!", von.getName().replace("<", "\\<"), client.getName().replace("<", "\\<")), String.format("actHighFive_%s...h_0.mx_-0.png", image(von, client)));
                        
                		Server.actions.remove(x);
                		return;
                	}
                }
        	}
        	     
        	if (!client.checkCode(239) && !client.hasPermission("cmd.highfive")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	if (arg.isEmpty()) {
        	      client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/highfive NICK#(Mit NICK einschlagen)");
        	      return;
        	}
        	
        	      String nicknamen = KCodeParser.escape(arg);
        	      boolean online = true;
        	      Client target = Server.get().getClient(nicknamen);
        	      if (target == null) {
        	        online = false;
        	        target = new Client(null);
        	        target.loadStats(nicknamen);
        	      }
        	      nicknamen = target.getName();

        	      if (arg.isEmpty()) {
        	        client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/highfive NICK#(Mit NICK einschlagen)");
        	        return;
        	      }

        	      if (nicknamen == null) {
        	        client.sendButlerMessage(channel.getName(), unknownUser(arg));
        	        return;
        	      }

        	      if (target.getName().equals(client.getName())) {
        	        client.sendButlerMessage(channel.getName(), "Du kannst doch nicht mit dir selbst einschlagen");
        	        return;
        	      }

        	      if (!online) {
        	        client.sendButlerMessage(channel.getName(), userIsOffline(target));
        	        return;
        	      }

        	      if (target.getName().equals(Server.get().getButler().getName())) {
        	        client.sendButlerMessage(channel.getName(), "Mit " + Server.get().getButler().getName() + " kannst du nicht einschlagen.");
        	        return;
        	      }

        	      if (!channel.getClients().contains(target)) {
        	        client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° hält sich im Moment _in einem anderen Channel_ auf.", new Object[] { target.getName() }));
        	        return;
        	      }

        	      client.sendButlerMessage(channel.getName(), String.format("%s wird gefragt, ob er mit dir einschlagen möchte.", new Object[] { target.getName() }));
        	      target.sendButlerMessage(channel.getName(), String.format("%s hält dir die erhobene Hand hin und wartet darauf, dass du einschlägst... °>finger.b.gif<°_°BB>_hEinschlagen|/highfive ok<°_", new Object[] { client.getName() }));
        	      Server.actions.put(time, new String[] {"highfive",target.getName(), client.getName(), channel.getName(), "30"});
        } else if(cmd.equals("snp")) {
        	if(!client.hasPermission("cmd.snp")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	if(KCodeParser.escape(arg).equals("list")) {
        		if(Server.snp.size() == 0) {
        			client.sendButlerMessage(channel.getName(), "Es sind keine Passwortneusetzungen gespeichert.");
        		} else {
            		StringBuilder list = new StringBuilder("_Nick°%30°Neugesetzt von°%60°Datum°%00°_#");
            		
            		for(long zeit : Server.snp.keySet()) {
            			String[] split = Server.snp.get(zeit);
            			String name = split[0];
                    	String von = split[1];
                    	String datum = Server.get().timeStampToDate(zeit);
                    	
                    	list.append(name).append("°%30°").append(von).append("°%60°").append(datum).append("°%00°#");
            		}
            		
            		client.send(Popup.create("Kürzlich geändete Passwörter", "Kürzlich geänderte Passwörter", list.toString(), 450, 300));
        		}
            } else {
            	client.send(PacketCreator.createSnpWindow(client.getName(), "", Password.generateRandom(8)));
            }
        } else if(cmd.equals("km")) {
        	if(!client.hasPermission("cmd.km")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	String error = "Bitte die Funktion folgendermaßen benutzen:#/km FRAGE:ANTWORT1:ANTWORT2:ANTWORT3:ANTWORT4";
        	
        	if(arg.isEmpty()) {
        		client.sendButlerMessage(channel.getName(), error);
        		return;
        	}
        	
        	String[] pieces = arg.split(":", 5);
        	
        	String frage = "";
        	String antwort1 = "";
        	String antwort2 = "";
        	String antwort3 = "";
        	String antwort4 = "";
        	
        	try {
        		frage = pieces[0];
        		antwort1 = pieces[1];
        		antwort2 = pieces[2];
        		antwort3 = pieces[3];
        		antwort4 = pieces[4];
        	} catch (Exception ex) {
        		client.sendButlerMessage(channel.getName(), error);
        		return;
        	}
        	
        	channel.broadcastMessage(String.format("°18RR°%s##A: %s..........B: %s#C: %s..........D: %s", frage, antwort1, antwort2, antwort3, antwort4), client, false);
        } else if(cmd.equals("macro")) {
        	if(!client.hasPermission("cmd.macro")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	arg = KCodeParser.escape(arg);
        	
        	if(arg.isEmpty()) {
            	client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/macro ? oder TYP:PARAMETER#(Ruft die Macro Hilfe auf oder führt das Macro TYP mit den Parametern PARAMETER aus.)");
        		return;
        	}
        	
        	if(arg.equals("?")) {
            	client.sendButlerMessage(channel.getName(), "Es gibt bisher keine Macros.");
        		return;
        	}

        	client.sendButlerMessage(channel.getName(), String.format("Das Macro _%s existiert nicht_.", arg));
      
        
        
        
        
         } else if(cmd.equals("checkmail")) {
        	if(!client.hasPermission("cmd.checkmail")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	if(arg.isEmpty()) {
        		client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/checkmail E-Mail-Adresse#(Prüft welche User sich mit dieser E-Mail eingeloggt haben.)");
        		return;
        	}
        	
        	StringBuilder email = new StringBuilder();
        	int treffer = 0;
        	PoolConnection pcon = ConnectionPool.getConnection();
            Statement ps = null;

            try {
                Connection con = pcon.connect();
                ps = con.createStatement();
                ResultSet rs = ps.executeQuery(String.format("SELECT `name`, `registration` FROM `accounts` WHERE `email` = '%s' ORDER BY `registration` DESC", arg.replace("-", ".")));
                
                while(rs.next()) {
                	String name = rs.getString("name");
                	long registration = rs.getLong("registration");
                	String uhrzeit = String.format("%s %s", Server.get().timeStampToDate(registration), Server.get().timeStampToTime(registration));
                	Client c = Server.get().getClient(name);
                	
                	if(c != null) {
                		email.append("_°B");
                	} else {
                		email.append("°");
                	}
                	
                	email.append(">_h").append(name.replace("<", "\\<")).append("|/serverpp \"|/w \"<%40");
                	
                	if(c != null) {
                		email.append("r°_");
                	} else {
                		email.append("°");
                	}
                	
                	email.append("(").append(uhrzeit).append(", E-Mail)°%00°#");
                	treffer++;
                }
                rs.close();
                rs = ps.executeQuery(String.format("SELECT `name`, `uhrzeit` FROM `loginlist` WHERE `ip` = '%s' ORDER BY `uhrzeit` DESC", arg.replace("-", ".")));
                
                while(rs.next()) {
                	String name = rs.getString("name");
                	String uhrzeit = rs.getString("uhrzeit");
                	Client c = Server.get().getClient(name);

                	if(c != null) {
                		email.append("_°B");
                	} else {
                		email.append("°");
                	}
                	
                	email.append(">_h").append(name.replace("<", "\\<")).append("|/serverpp \"|/w \"<%40");

                	if(c != null) {
                		email.append("r°_");
                	} else {
                		email.append("°");
                	}
                	
                	email.append("(").append(uhrzeit).append(")°%00°#");
                	treffer++;
                }
                rs.close();
                
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                if (ps != null) {
                    try {
                        ps.close();
                    } catch (SQLException e) {
                    }
                }

                pcon.close();
            }
            
            if(email.toString().isEmpty()) {
            	client.sendButlerMessage(channel.getName(), String.format("Keine Übereinstimmungen mit der _E-Mail %s_ gefunden.", arg));
            	return;
            }
            
            String title = String.format("%s - %s Treffer", arg, treffer);
            client.send(Popup.create(title, title, email.toString(), 450, 300));
        
        
        
        
        
        
        } else if(cmd.equals("checkip")) {
        	if(!client.hasPermission("cmd.checkip")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	if(arg.isEmpty()) {
        		client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/checkip IP-ADRESSE#(Prüft welche User sich mit dieser IP eingeloggt haben.)");
        		return;
        	}
        	
        	StringBuilder ip = new StringBuilder();
        	int treffer = 0;
        	PoolConnection pcon = ConnectionPool.getConnection();
            Statement ps = null;

            try {
                Connection con = pcon.connect();
                ps = con.createStatement();
                ResultSet rs = ps.executeQuery(String.format("SELECT `name`, `registration` FROM `accounts` WHERE `registerIP` = '%s' ORDER BY `registration` DESC", arg.replace("-", ".")));
                
                while(rs.next()) {
                	String name = rs.getString("name");
                	long registration = rs.getLong("registration");
                	String uhrzeit = String.format("%s %s", Server.get().timeStampToDate(registration), Server.get().timeStampToTime(registration));
                	Client c = Server.get().getClient(name);
                	
                	if(c != null) {
                		ip.append("_°B");
                	} else {
                		ip.append("°");
                	}
                	
                	ip.append(">_h").append(name.replace("<", "\\<")).append("|/serverpp \"|/w \"<%40");
                	
                	if(c != null) {
                		ip.append("r°_");
                	} else {
                		ip.append("°");
                	}
                	
                	ip.append("(").append(uhrzeit).append(", Register-IP)°%00°#");
                	treffer++;
                }
                rs.close();
                rs = ps.executeQuery(String.format("SELECT `name`, `uhrzeit` FROM `loginlist` WHERE `ip` = '%s' ORDER BY `uhrzeit` DESC", arg.replace("-", ".")));
                
                while(rs.next()) {
                	String name = rs.getString("name");
                	String uhrzeit = rs.getString("uhrzeit");
                	Client c = Server.get().getClient(name);

                	if(c != null) {
                		ip.append("_°B");
                	} else {
                		ip.append("°");
                	}
                	
                	ip.append(">_h").append(name.replace("<", "\\<")).append("|/serverpp \"|/w \"<%40");

                	if(c != null) {
                		ip.append("r°_");
                	} else {
                		ip.append("°");
                	}
                	
                	ip.append("(").append(uhrzeit).append(")°%00°#");
                	treffer++;
                }
                rs.close();
                
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                if (ps != null) {
                    try {
                        ps.close();
                    } catch (SQLException e) {
                    }
                }

                pcon.close();
            }
            
            if(ip.toString().isEmpty()) {
            	client.sendButlerMessage(channel.getName(), String.format("Keine Übereinstimmungen mit der _IP %s_ gefunden.", arg));
            	return;
            }
            
            String title = String.format("%s - %s Treffer", arg, treffer);
            client.send(Popup.create(title, title, ip.toString(), 450, 300));
        } else if(cmd.equals("kickall")) {
        	if(!client.hasPermission("cmd.kickall")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	for(Client cl : channel.getClients()) {
        		if(!cl.getName().equals(client.getName()) && !cl.getName().equals(Server.get().getButler().getName())) {
        			cl.disconnect();
        		}
        	}

        	Server.get().newSysLogEntry(client.getName(), String.format("KickAll Channel %s", channel.getName()));
        } else if(cmd.equals("helpeditor")) {
        	if(!client.hasPermission("cmd.helpeditor")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	client.sendButlerMessage(channel.getName(), "°RR°_Funktion deaktiviert.");
        } else if(cmd.equals("botcontrol")) {
        	arg = KCodeParser.escape(arg);
        	
        	if(arg.equals("no") && client.getBotkontrolleVon() != null) {
        		Client von = Server.get().getClient(client.getBotkontrolleVon());
        		
        		client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° wurde darüber informiert, dass du am PC sitzt und keinen Bot verwendest.", client.getBotkontrolleVon()));
        		Server.get().newMessage(Server.get().getButler(), client.getBotkontrolleVon(), String.format("Nicht bestätigt: Botkontrolle %s", client.getName()), String.format("%s hat auf eine Kontroll-Nachricht reagiert, damit hat sich der Bot-Verdacht nicht bestätigt.", client.getName()), time);
        		client.setBotkontrolleVon(null);
        		von.setBotkontrolleAn(null);
        		von.setBotkontrolleZeit(0);
        		return;
        	}
        	
        	if(!client.hasPermission("cmd.botcontrol")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	if(arg.isEmpty()) {
        		client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/botcontrol NICK#(Eine Botkontrolle bei NICK durchführen.)");
        		return;
        	}
            
            Client target = Server.get().getClient(arg);
        	boolean online = true;
        	
        	if(target == null) {
        		online = false;
        		target = new Client(null);
        		target.loadStats(arg);
        		
        		if(target.getName() == null) {
        			client.sendButlerMessage(channel.getName(), unknownUser(arg));
        			return;
        		}
        	}

            if(target == client || target == Server.get().getButler() || target.getRank() > 4) {
                client.sendButlerMessage(channel.getName(), String.format("Du kannst bei °>_h%s|/serverpp \"|/w \"<° keine Botkontrolle durchführen.", target.getName().replace("<", "\\<")));
                return;
            }
            
            if(target.getBotkontrolleAn() != null) {
            	client.sendButlerMessage(channel.getName(), "Du überprüfst momentan bereits eine Person auf Botnutzung. Geduldige dich bitte einen Augenblick.");
            	return;
            }
            
            if(target.getBotkontrolleVon() != null) {
            	client.sendButlerMessage(channel.getName(), String.format("%s wird momentan bereits auf Botbotnutzung überprüft.", target.getName()));
            	return;
            }
        	
        	if(!online) {
        		client.sendButlerMessage(channel.getName(), userIsOffline(target));
        		return;
        	}
        	
        	client.sendButlerMessage(channel.getName(), String.format("%s erhält jetzt eine Kontroll-Nachricht. Du erhältst eine Info, sobald das Ergebnis der Kontrolle feststeht.", target.getName()));
        		
        	for(Channel s : target.getChannels()) {
        		target.sendButlerMessage(s.getName(), String.format("°20°_Überprüfung auf Bot-Benutzung_°r°##°>_h%s|/serverpp \"|/w \"<° möchte überprüfen, ob du selbst am PC sitzt.##°RR°_WICHTIG_°r°: Klick _°>{button} Bestätigen ||call|/botcontrol no<° _, um zu bestätigen, dass du kein Bot-Programm verwendest.", client.getName()));
        	}
        	target.setBotkontrolleVon(client.getName());
        	client.setBotkontrolleAn(target.getName());
        	client.setBotkontrolleZeit(time);
        } else if(cmd.equals("buzzer")) {
        	if (!client.checkCode(164) && !client.hasPermission("cmd.buzzer")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}

            if(client.getWeckMessage() == 1) {
            	client.sendButlerMessage(channel.getName(), "Du kannst dieses Feature momentan nicht benutzen.");
            	return;
            }
            
        	String nick = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            
            if (arg.length() > nick.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            if(nick.isEmpty()) {
            	client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/buzzer +NICK:TEXT#(NICK eine Weck-Botschaft mit der Nachricht TEXT übermitteln.)");
            	return;
            }
            
            if(nick.startsWith("+")) {
            	nick = nick.substring(1);
            }
            
            Client target = Server.get().getClient(nick);
        	boolean online = true;
        	
        	if(target == null) {
        		online = false;
        		target = new Client(null);
        		target.loadStats(nick);
        		
        		if(target.getName() == null) {
        			client.sendButlerMessage(channel.getName(), unknownUser(nick));
        			return;
        		}
        	}

            if(target == client) {
                client.sendButlerMessage(channel.getName(), "Du kannst dir selbst keine Weck-Botschaft schicken.");
                return;
            }
        	
        	if(!online) {
        		client.sendButlerMessage(channel.getName(), userIsOffline(target));
        		return;
        	}

        	client.sendButlerMessage(channel.getName(), String.format("Du hast _°BB>_h%s|/serverpp \"|/w \"<r°_ jetzt folgende Weck-Botschaft gesendet...°>|{backgroundad|buzzerAd_bright.jpg|buzzerAd_bright.jpg|buzzerAd_dark.jpg|buzzerAd_dark.jpg|0|0|0|0|1|20|http://www.knuddels.de| %s|255,255,255|255,255,255|28|0|-22<>alarmring_buzzer.mp<°", target.getName().replace("<", "\\<"), msg));
        	
        	for(Channel s : target.getChannels()) {
            	target.sendButlerMessage(s.getName(), String.format("_°BB>_h%s|/serverpp \"|/w \"<r°_ sendet dir diese Weck-Botschaft...°>|{backgroundad|buzzerAd_bright.jpg|buzzerAd_bright.jpg|buzzerAd_dark.jpg|buzzerAd_dark.jpg|0|0|0|0|1|20|http://www.knuddels.de| %s|255,255,255|255,255,255|28|0|-22<>alarmring_buzzer.mp<°", client.getName(), msg));
        	}
        	
        	client.setWeckMessage((byte)1);
        } else if(cmd.equals("color")) {
        	if(!client.hasPermission("cmd.color")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            String nick = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            
            if (arg.length() > nick.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            if(nick.isEmpty() || msg.isEmpty()) {
            	client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/color NICK:RGB-Code oder !#(Farbe von NICK auf RGB-Code setzen oder löschen.)");
            	return;
            }
            
            Client target = Server.get().getClient(nick);
        	boolean online = true;
        	
        	if(target == null) {
        		online = false;
        		target = new Client(null);
        		target.loadStats(nick);
        		
        		if(target.getName() == null) {
        			client.sendButlerMessage(channel.getName(), unknownUser(nick));
        			return;
        		}
        	}
        	
        	if(!online) {
        		client.sendButlerMessage(channel.getName(), userIsOffline(target));
        		return;
        	}
        	if(!msg.equals("!")) { 
        		if(!msg.contains(",") || msg.split(",").length < 2) {
        			client.sendButlerMessage(channel.getName(), "Ungültige Farbe! _Beispiel_: 0,0,0 für Schwarz oder 255,255,255 für Weiß.");
        			return;
        		}
        	
        		for(String x : msg.split(",")) {
        			x = x.trim();
        		
        			try {
        				Integer.parseInt(x);
        			} catch (Exception ex) {
        				client.sendButlerMessage(channel.getName(), "Ungültige Farbe! _Beispiel_: 0,0,0 für Schwarz oder 255,255,255 für Weiß.");
        				return;
        			}
        		
        			int zahl = Integer.parseInt(x);
        		
        			if(zahl < 0 || zahl > 255) {
            			client.sendButlerMessage(channel.getName(), "Ungültige Farbe! _Beispiel_: 0,0,0 für Schwarz oder 255,255,255 für Weiß.");
            			return;
        			}
        		}
        	}
        	client.sendButlerMessage(channel.getName(), String.format("_°[%s]°Farbe von %s %s._", msg, target.getName(), msg.equals("!")?"gelöscht":"geändert"));
        	target.setColor(msg.equals("!")?"":msg);
        } else if(cmd.equals("butterfly")) {
        	if (!client.checkCode(103) && !client.hasPermission("cmd.butterfly")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung");
        		return;
        	}
        	
        	if(client.getButterflysperre() == 1) {
        		client.sendButlerMessage(channel.getName(), "Du kannst dieses Feature momentan nicht benutzen.");
        		return;
        	}
        	
            String nick = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            
            if (arg.length() > nick.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            if(nick.isEmpty() || msg.isEmpty()) {
            	client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/butterfly NICK:NACHRICHT#(Einen Schmetterling mit der Nachricht NACHRICHT an NICK senden.)");
            	return;
            }
            
            Client target = Server.get().getClient(nick);
        	boolean online = true;
        	
        	if(target == null) {
        		online = false;
        		target = new Client(null);
        		target.loadStats(nick);
        		
        		if(target.getName() == null) {
        			client.sendButlerMessage(channel.getName(), unknownUser(nick));
        			return;
        		}
        	}
        	
        	if(!online) {
        		client.sendButlerMessage(channel.getName(), userIsOffline(target));
        		return;
        	}
        	
        	if(target == client || target == Server.get().getButler()) {
        		client.sendButlerMessage(channel.getName(), String.format("Du kannst kein Schmetterling an %s senden.", target.getName()));
        		return;
        	}
        	
            if (!channel.getClients().contains(target)) {
                client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° hält sich im Moment _in einem anderen Channel_ auf.", target.getName().replace("<", "\\<")));
                return;
            }

            msg = KCodeParser.parse(client, msg, 0, 10, 20);
            msg = Server.get().parseSmileys(client, msg);

        	channel.broadcastButlerMessage(String.format("%s lässt einen Schmetterling °>{sprite}type:0|startpause:10000|flytime:10000|restinlist:120000|imgfly:pics/abo/butterfly_fly_010.gif|imgrest:pics/abo/butterfly_rest_010.gif|imgshadow:pics/abo/butterfly_rest_010.gif|imgshadow:pics/abo/butterfly_shadow.png|nickname:%s<° fliegen und gibt ihm diese Nachricht mit: \"\"%s§\"\". Wo er wohl landen wird?", client.getName(), target.getName().replace("<", "\\<"), msg));
        	client.setButterflysperre((byte)1);
        } else if(cmd.equals("sendheart")) {
        	if (!client.checkCode(104) && !client.hasPermission("cmd.sendheart")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung");
        		return;
        	}
        	
        	if(client.getBazookasperre() == 1) {
        		client.sendButlerMessage(channel.getName(), "Du kannst dieses Feature momentan nicht benutzen.");
        		return;
        	}
        	
        	arg = KCodeParser.escape(arg);
        	Client target = Server.get().getClient(arg);
        	boolean online = true;
        	
        	if(target == null) {
        		online = false;
        		target = new Client(null);
        		target.loadStats(arg);
        		
        		if(target.getName() == null) {
        			client.sendButlerMessage(channel.getName(), unknownUser(arg));
        			return;
        		}
        	}
        	
        	if(!online) {
        		client.sendButlerMessage(channel.getName(), userIsOffline(target));
        		return;
        	}
        	
        	if(target == client || target == Server.get().getButler()) {
        		client.sendButlerMessage(channel.getName(), String.format("Du kannst kein Herz an %s senden.", target.getName()));
        		return;
        	}

            if (!channel.getClients().contains(target)) {
                client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° hält sich im Moment _in einem anderen Channel_ auf.", target.getName().replace("<", "\\<")));
                return;
            }
        	
        	channel.broadcastButlerMessage(String.format("%s schickt ein Herz °>{sprite}type:1|nickname:%s|img:pics/abo/flying_heart_002.png<° an eine ganz besondere Person...", client.getName(), target.getName().replace("<", "\\<")));
        	client.setBazookasperre((byte)1);
        } else if(cmd.equals("sunshine")) {
        	if (!client.checkCode(1111) && !client.hasPermission("cmd.sunshine")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung");
        		return;
        	}
        	
        	if(client.getSunLock() == 1) {
        		client.sendButlerMessage(channel.getName(), "Du kannst dieses Feature momentan nicht benutzen.");
        		return;
        	}
        	
        	arg = KCodeParser.escape(arg);
        	Client target = Server.get().getClient(arg);
        	boolean online = true;
        	
        	if(target == null) {
        		online = false;
        		target = new Client(null);
        		target.loadStats(arg);
        		
        		if(target.getName() == null) {
        			client.sendButlerMessage(channel.getName(), unknownUser(arg));
        			return;
        		}
        	}
        	
        	if(!online) {
        		client.sendButlerMessage(channel.getName(), userIsOffline(target));
        		return;
        	}
        	
        	if(target == client || target == Server.get().getButler()) {
        		client.sendButlerMessage(channel.getName(), String.format("Du kannst keine Sonne an %s senden.", target.getName()));
        		return;
        	}

            if (!channel.getClients().contains(target)) {
                client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° hält sich im Moment _in einem anderen Channel_ auf.", target.getName().replace("<", "\\<")));
                return;
            }
        	
        	channel.broadcastAction(client.getName(), String.format("sendet eine °>{sprite}type:0|startpause:10000|flytime:60000|listxoffs:120|timetolist:10000|restinlist:15000|imgfly:pics/sunshinechat...h0.png|imgflylist:pics/sunshinenick.png|imgrest:pics/sunshinechat...h0.png|h:85|w:85|maxspeed:150|imgshadow:pics/transparent1x1.gif|imgrestinlist:pics/sunshinenick.png|nickname:%s<° los. Zu wem die wohl fliegen wird?", target.getName().replace("<", "\\<")));
        	client.setSunLock((byte) 1);
        	target.setSun((byte)1);
        } else if(cmd.equals("flyingbed")) {
        	if (!client.checkCode(126) && !client.hasPermission("cmd.flyindbed")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung");
        		return;
        	}
        	
        	if(client.getFlyingbedsperre() == 1) {
        		client.sendButlerMessage(channel.getName(), "Du kannst dieses Feature momentan nicht benutzen.");
        		return;
        	}

        	List<String> list = new ArrayList<String>();
        	
        	for(Channel ch : Server.get().getChannels()) {
        		if(ch.countClients() > 1) {
        			list.add(ch.getName());
        		}
        	}
        	
    		Collections.shuffle(list);
			Channel c = Server.get().getChannel(list.get(0));
        	
			client.sendButlerMessage(channel.getName(), String.format("Du bist im Channel %s geflogen und hast %s anwesende Chatter geknuddelt.", c.getName(), c.countClients()));
			c.broadcastButlerMessage(String.format("°>flyingbed...b.my_16.h_57.gif<° °18BB°_%s kommt hereingeflogen und knuddelt alle Chatter mal so richtig durch...", client.getName()));
			
			for(Client s : c.getClients()) {
				s.increaseKnuddels(1);
			}
			
        	client.setFlyingbedsperre((byte)1);
        } else if(cmd.equals("wink")) {
        	if (!client.checkCode(1111) && !client.hasPermission("cmd.wink")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung");
        		return;
        	}
        	
            String ch = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            
            if (arg.length() > ch.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            if(msg.isEmpty() || ch.isEmpty()) {
            	client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/wink CHANNEL:NACHRICHT#(Im Channel CHANNEL mit der Nachricht TEXT herüberwinken.)");
            	return;
            }
            
            if(client.getWinksperre() == 1) {
            	client.sendButlerMessage(channel.getName(), "Du kannst dieses Feature momentan nicht benutzen.");
            	return;
            }
            
            Channel target = Server.get().getChannel(ch);
            
            if(target == null) {
            	client.sendButlerMessage(channel.getName(), String.format("Der Channel _%s existiert nicht_.", ch));
            	return;
            }
            
            if(client.getChannels().contains(target)) {
            	client.sendButlerMessage(channel.getName(), String.format("Um im Channel %s herüberwinken zu können, darfst du dich nicht in dem Channel aufhalten.", target.getName()));
            	return;
            }

            msg = KCodeParser.parse(client, msg, 0, 10, 20);
            msg = Server.get().parseSmileys(client, msg);
            
            client.sendButlerMessage(channel.getName(), String.format("Du hast im Channel %s herübergewunken.", target.getName()));
            target.broadcastButlerMessage(String.format("%s winkt aus dem Channel %s herüber: °RR°_\"\"%s§°RR°_\"\"§.", client.getName(), channel.getName(), msg));
            client.setWinksperre((byte)1);
        } else if(cmd.equals("grippe")) {
        	if (!client.checkCode(142) && !client.checkCode(149) && !client.hasPermission("cmd.grippe.analyze") && !client.hasPermission("cmd.grippe.immun") && !client.hasPermission("cmd.grippe.heal")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung");
        		return;
        	}
        	
            String typ = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String nick = "";
            
            if (arg.length() > typ.length()) {
                nick = KCodeParser.escape(arg.substring(arg.indexOf(':') + 1));
            }
            
            if(nick.isEmpty() || typ.isEmpty()) {
            	return;
            }
            
            Client target = Server.get().getClient(nick);
            boolean online = true;
            
            if(target == null) {
            	online = false;
            	target = new Client(null);
            	target.loadStats(nick);
            	
            	if(target.getName() == null) {
            		client.sendButlerMessage(channel.getName(), unknownUser(nick));
            		return;
            	}
            }
            
            if(!online) {
            	client.sendButlerMessage(channel.getName(), userIsOffline(target));
            	return;
            }
            
            if (!channel.getClients().contains(target)) {
                client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° hält sich im Moment _in einem anderen Channel_ auf.", target.getName().replace("<", "\\<")));
                return;
            }
            
            if(typ.equals("analyze")) {
            	if (!client.checkCode(142) && !client.hasPermission("cmd.grippe.analyze")) {
            		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung");
            		return;
            	}
            	
            	client.sendButlerMessage(channel.getName(), target.getGrippeStatus()<1?String.format("%s fühlt sich momentan den Umständen entsprechend gut.", target.getName()):String.format("%s fühlt sich elend und ist bereits an der Grippe erkrankt.", target.getName()));
            	for(Channel c : target.getChannels()) {
            		target.sendButlerMessage(c.getName(), String.format("Doktor %s untersucht dich gerade auf Herz und Nieren...", client.getName()));
            	}
            	return;
            }
            
            if(typ.equals("heal")) {
            	if (!client.checkCode(149) && !client.hasPermission("cmd.grippe.heal")) {
            		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung");
            		return;
            	}
            	
            	if(client.getHealsperre() == 1) {
            		client.sendButlerMessage(channel.getName(), "Du kannst dieses Feature momentan nicht benutzen.");
            		return;
            	}
            	
            	if(target.getGrippeStatus() < 1) {
            		client.sendButlerMessage(channel.getName(), String.format("%s ist nicht an der Grippe erkrankt.", target.getName()));
            		return;
            	}

            	channel.broadcastButlerMessage(String.format("°>hands_ani...b.my_6.h_21.gif<° %s hat %s erfolgreich von der Grippe befreit.", client.getName(), target.getName()));
            	removeIcon("pics/nose.gif", target.getName(), channel);
            	target.setGrippeStatus((byte)0);
            	client.setHealsperre((byte)1);
            	return;
            }
            
            if(typ.equals("immun")) {
            	if (!client.checkCode(155) && !client.hasPermission("cmd.grippe.immun")) {
            		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung");
            		return;
            	}
            	
            	if(client.getImmunsperre() == 1) {
            		client.sendButlerMessage(channel.getName(), "Du kannst dieses Feature momentan nicht benutzen.");
            		return;
            	}
            	
            	if(target.getGrippeStatus() > 0) {
            		client.sendButlerMessage(channel.getName(), String.format("%s ist bereits an der Grippe erkrankt.", target.getName()));
            		return;
            	}

            	channel.broadcastButlerMessage(String.format("°>spritze_ani_green...b.mx_-8.my_14.w_28.h_21.gif<° %s hat %s erfolgreich geimpft. Nun muss sich %s erstmal ziemlich lange keine Sorgen wegen einer neuen Grippe machen.", client.getName(), target.getName(), target.getName()));
            	client.setImmunsperre((byte)1);
            	return;
            }
        } else if(cmd.equals("konto")) {
        	if (!client.checkCode(74) && !client.hasPermission("cmd.konto")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung");
        		return;
        	}
        	
        	if(client.getKontoPassword().isEmpty()) {
        		client.send(PacketCreator.kontoPw(client.getName()));
        		return;
        	}

    		client.send(PacketCreator.konto(client.getName(), client.getKontoKnuddels()));
        }
         else if(cmd.equals("set")) {
             
         }
        
        else if(cmd.equals("deny")) {
        	if(!client.hasPermission("cmd.deny")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung");
        		return;
        	}
                
        	
        	if(client.getDeny() == null) {
        		client.sendButlerMessage(channel.getName(), "Du kannst momentan kein Herz zurückgeben.");
        		return;
        	}
        	
        	Client target = Server.get().getClient(client.getDeny());
        	boolean online = true;
        	
        	if(target == null) {
        		online = false;
        		target = new Client(null);
        		target.loadStats(client.getDeny());
        	}
        	
        	if(!target.getHeart().equals(client.getName())) {
        		client.sendButlerMessage(channel.getName(), "Du kannst momentan kein Herz zurückgeben.");
        		return;
        	}
        	
        	channel.broadcastPicAction(">", String.format("%s hat sein Herz wohl umsonst verschenkt, denn %s möchte es nicht haben!", target.getName(), client.getName()), String.format("actDeny_%s.png", image(client, target))); 
        	Server.get().newMessage(Server.get().getButler(), target.getName(), "Herz zurückgegeben", String.format("%s hat dir dein Herz zurückgegeben.", client.getName()), time);
        	
        	if(online) {
        		target.setHeart("");
        		target.receivedHearts.remove(client.getName());
        	} else {
        		Server.get().query(String.format("update accounts set heart='' where name='%s'", target.getName()));
        	}
        	client.setDeny(null);
        } else if(cmd.equals("analysedata")) {
        	if (!client.checkCode(1111) && !client.hasPermission("cmd.loveletter")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung");
        		return;
        	}
        	
        	if(client.getAnalysedatasperre() == 1) {
        		client.sendButlerMessage(channel.getName(), "Du kannst dieses Feature momentan nicht benutzen.");
        		return;
        	}

        	int a = Server.get().getAllKnuddels();
        	int b = Server.get().getAllKontoKnuddels();
        	int knuddels = a+b;
        	StringBuilder ad = new StringBuilder();
        	ad.append("k\0Statistiken zu CuddlyChatõhÿÿÿãNl õgFhÿÿÿãSl õgFhÿÿÿãEl         õgFhÿÿÿãWl         õgFhÿÿÿãCpBCpBCc");
        	ad.append("°>{imageboxstart}boxS.my_-4.mh_30<°#°20+0015+9515°_Statistiken zu Cuddlychat°b° °>features/analyse-data/ft_statistik...my_10.h_0.png<°°12+0000°##°+5040°#°+9505°°+0020>layout/bullet2.png<+0040°_").append(knuddels).append(" Knuddels_ im Umlauf#°+0000°");
        	//ad.append("#°+9505°°+0020>layout/bullet2.png<+0040°Am häufigsten geklickter _Wiki-Link°b°: _°BB>_hWikipedia-Link|http://de.wikipedia.org/wiki/SMS-Gateway<bK°#°+0000°#°+9505°°+0020>layout/bullet2.png<+0040°Am häufigsten geklickter _Youtube-Link°b°: _°BB>_hYouTube-Link|http://www.youtube.com/watch?v=75R2__kCp8KA<bK°#°+0000°#°+9505°°+0020>layout/bullet2.png<+0040°_°BB>_hSuper TT Player|/serverpp \"|/w \"<°°°_ besitzt _die meisten Rosen_ (_16.060°b°)#°+0000°#°+9505°°+0020>layout/bullet2.png<+0040°_°BB>_hPfirsichgeschmack|/serverpp "|/w "<°°°_ besitzt _die meisten Geschenke_ (_1.445°b°)#°+0000°#°+9505°°+0020>layout/bullet2.png<+0040°_17_ verschickte _Herzbotschaften_ diese Woche#°+0000°#°+9505°°+0020>layout/bullet2.png<+0040°_10.197_ verschickte _Rosen_ diese Woche#°+0000°#°+9505°°+0020>layout/bullet2.png<+0040°_2,7 Nutzer im Schnitt_ hatte der Channel _Worms°b° in den letzten 3 Tagen#°+0000°#°+9505°°+0020>layout/bullet2.png<+0040°_5.193 Billard-Spiele_ heute#°+0000°#°+9505°°+0020>layout/bullet2.png<+0040°_6.634 öffentliche MyChannels_ gestern#°+0000°#°+9505°°+0020>layout/bullet2.png<+0040°_144.337 Küsse_ heute#°+0000°#°+9505°°+0020>layout/bullet2.png<+0040°Um _21.03 Uhr°b° war der _Chat gestern am vollsten°b°. Es waren _21.734 User online°b°.#°+0000°#°+9505°°+0020>layout/bullet2.png<+0040°_Stammchatter des Monats_ ist _°BB>_hbirdem|/serverpp "|/w "<°°°_°b°.#°+0000°#°+9505°°+0020>layout/bullet2.png<+0040°_2.645 CMs_#°+0000°#°+9505°°+0020>layout/bullet2.png<+0040°_558 Teamler_#°+0000°#°+9505°°+0020>layout/bullet2.png<+0040°_31.198 MCMs_#°+0000°");
        	ad.append("## °+0000+5000>CENTER<°_°r>{button}OK||call|_c|width|70|heigth|28<°_°>{imageboxend}<°##°>LEFT<°");
        	ad.append("õs\0ÌtsendbackõhÿÿÿãSl õgFhÿÿÿãããã");
        	client.send(ad.toString());
        	channel.broadcastPicAction(">", String.format("°>_h%s|/serverpp \"|/w \"<° weiß Dank eines Blicks in die geheime Server-Datenbank offensichtlich mehr als andere:#_%s Knuddels_ sind im Umlauf.°+0000°§", client.getName(), knuddels), "../features/analyse-data/ft_statistik.png");
        	client.setAnalysedatasperre((byte)1);
        } else if(cmd.equals("mentor")) {
        	if(!client.hasPermission("cmd.mentor") && !client.hasPermission("cmd.mentor.reward")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            String nickn = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            
            if (arg.length() > nickn.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
        	
        	if(nickn.isEmpty()) {
            	if(!client.hasPermission("cmd.mentor")) {
            		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            		return;
            	}
            	
                if(client.getSchuetzlinge().isEmpty()) {
                	client.sendButlerMessage(channel.getName(), "Du hast noch keine Schützlinge.");
                    return;
                }

                StringBuilder f = new StringBuilder();
                StringBuilder on = new StringBuilder();
                StringBuilder off = new StringBuilder();
                String eingabe = client.getSchuetzlinge().replace("||", "~").replace("|", "");
                String[] strarr = eingabe.split("~");
                
                Arrays.sort(strarr);
                for (int i = 0; i < strarr.length; i++) {
                	String nick = strarr[i];
        			Client c = Server.get().getClient(nick);
        			
        				if(c == null) {
        					c = new Client(null);
        					c.loadStats(nick);
        					
                                Channel n = Server.get().getChannel(c.getLastOnlineChannel());
                                        
                                off.append("#°>schaf.png<°°%06°_°>_h").append(nick.replace("<", "\\<")).append("|/serverpp \"|/w \"<r°_ war zuletzt am _").append(c.getLastOnlineDate()).append("_ ").append(c.getLastOnlineTime()).append(" im Channel _");
                                
                                if(!n.isVisible()) {
                                	off.append("?");
                                } else {
                                	off.append("°>_h").append(n.getName()).append("|/go \"|/go +\"<°");
                                }
                                
                                off.append("_");
        					
                                if(c.getReadme() != null) {
                                	off.append("#°%06°\"\"").append(Server.get().parseSmileys(c, c.getReadme())).append("§\"\"");
                                }
        					
                                off.append("°%00°");
                            
        					
        				} else {
        					on.append("#°>schaf.png<°°%06°_°>_h").append(nick.replace("<", "\\<")).append("|/serverpp \"|/w \"<°_ ist im Channel _");
        					
        					if(c.getChannel().isVisible()) {
        						on.append("°>_h").append(c.getChannel().getName()).append("|/go \"|/go +\"<°");
        					} else {
        						on.append("?");
        					}
        					
        					on.append("°E° ONLINE_°r°!");
        					
                            if(c.isAway()) {
                            	if(c.getRank() > 5) {
                                	on.append(" °>icon_away_ani_new.gif<°");
                            	}else {
                            		on.append(" °>away.png<°");
                            	}
                            }
        					
        					if(c.getReadme() != null) {
        						on.append("#°%06°\"\"").append(Server.get().parseSmileys(c, c.getReadme())).append("§\"\"");
                            }
        					
        					on.append("°%00°");
        				}
        			}
                
                f.append(on.toString()).append(on.toString().isEmpty()?"":"#").append(off.toString());
                String title = String.format("Deine Schützlinge (%s/%s)", strarr.length, 20);
                client.send(Popup.create(title, title, f.toString(), 575, 325));
                return;
        	}     
        	
        	if(nickn.toLowerCase().equals("reward") && !msg.isEmpty()) {
            	if(!client.hasPermission("cmd.mentor.reward")) {
            		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            		return;
            	}
            	
        		if(client.getBelohnen() == 1) {
        			client.sendButlerMessage(channel.getName(), "Du kannst momentan niemanden belohnen.");
        			return;
        		}
        		
            	Client target = Server.get().getClient(msg);
            	boolean online = true;
            	
            	if(target == null) {
            		online = false;
            		target = new Client(null);
            		target.loadStats(msg);
            		
            		if(target.getName() == null) {
            			client.sendButlerMessage(channel.getName(), unknownUser(msg));
            			return;
            		}
            	}
            	
            	if(target.getIPAddress().equals(client.getIPAddress())) {
            		client.sendButlerMessage(channel.getName(), String.format("Du kannst %s nicht für die Belohnung auswählen.", target.getName()));
            		return;
            	}
            	
            	client.sendButlerMessage(channel.getName(), String.format("Du hast %s für die Belohnung ausgewählt.", target.getName()));
            	Server.get().newMessage(Server.get().getButler(), target.getName(), "Ein Mentorpunkt", String.format("Frage: Wer hat dir bisher am meisten bei Cuddlychat geholfen?#Antwort von %s: Ganz klar %s!##Glückwunsch! Aus diesem Grund erhälst du _ein Mentorpunkt_.", client.getName(), target.getName()), time);
            	
            	if(online) {
            		target.increaseMentorPoints(1);
            	} else {
            		Server.get().query(String.format("update accounts set mentorPoints=mentorPoints+'1' where name='%s'", target.getName()));
            	}
            	
            	client.setBelohnen((byte)1);
        		return;
        	}
        	
        	if(!client.hasPermission("cmd.mentor")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	boolean delete = false;
        	
        	if(nickn.startsWith("!")) {
        		delete = true;
        		nickn = nickn.replace("!", "");
        	}
        	
        	Client target = Server.get().getClient(nickn);
        	
        	if(target == null) {
        		target = new Client(null);
        		target.loadStats(nickn);
        		
        		if(target.getName() == null) {
        			client.sendButlerMessage(channel.getName(), unknownUser(nickn));
        			return;
        		}
        	}
        	
        	if(delete) {
        		if(!client.checkSchuetzling(target.getName())) {
        			client.sendButlerMessage(channel.getName(), String.format("%s steht nicht auf deiner Mentor List.", target.getName()));
        			return;
        		}
        		
        		client.sendButlerMessage(channel.getName(), String.format("%s wurde von deiner Mentor List entfernt.", target.getName()));
        		client.setSchuetzlinge(client.getSchuetzlinge().replace(String.format("|%s|", target.getName()), ""));
        		return;
        	}
        	
        	if(!target.getMentor().equals(client.getName())) {
        		client.sendButlerMessage(channel.getName(), String.format("%s ist nicht dein Schützling.", target.getName()));
        		return;
        	}

    		if(client.checkSchuetzling(target.getName())) {
    			client.sendButlerMessage(channel.getName(), String.format("%s steht bereits auf deiner Mentor List.", target.getName()));
    			return;
    		}
        	
        	client.sendButlerMessage(channel.getName(), String.format("%s wurde deiner Mentor List wieder hinzugefügt.", target.getName()));
        	client.setSchuetzlinge(String.format("%s|%s|", client.getSchuetzlinge(), target.getName()));
        } else if(cmd.equals("mymentor")) {
        	if(!client.hasPermission("cmd.mymentor")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	if(client.getMentor().isEmpty()) {
        		client.sendButlerMessage(channel.getName(), "Sie haben keinen Mentor.");
        		return;
        	}
        	
        	client.sendButlerMessage(channel.getName(), String.format("Der Nick Ihres Mentors lautet _°>_h%s|/serverpp \"|/w \"<°_.", client.getMentor().replace("<", "\\<")));
        } else if(cmd.equals("bet")) {
        	if(!client.hasPermission("cmd.bet")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	arg = KCodeParser.escape(arg);
        	
        	if(arg.isEmpty()) {
        		client.sendButlerMessage(channel.getName(), "Derzeit laufen keine Wetten.");
        		return;
        	}
        	
        	client.sendButlerMessage(channel.getName(), String.format("Die Wette %s gibt's nicht!", arg));
        } else if(cmd.equals("hol")) {
        	if(!channel.getGameName().equals("HIGH OR LOW")) {
        		return;
        	}
        	
        	if(!client.hasPermission("cmd.hol")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	if(client.getSpielsperre() != 0) {
        		client.sendButlerMessage(channel.getName(), "Du bist momentan für alle Spiele gesperrt.");
        		return;
        	}
        	
        	Random xd = new Random();
        	int zahl = xd.nextInt(50)+1;
        	
        	if(zahl == client.getHighOrLowNumber()) {
        		if(zahl == 50) {
        			zahl--;
        		} else {
        			zahl++;
        		}
        	}
        	
        	int krzahl = xd.nextInt(200)+1;
        	int runde = client.getHighOrLowRound();
        	int points = 0;
        	
        	if(runde > 1) {
        		points = 2*runde;
        	}
        	
        	if(arg.equals("start")) {
        		if(runde != 0) {
        			client.sendButlerMessage(channel.getName(), String.format("Du spielst bereits High or Low. Deine Zahl ist _°18RR>{textborder}<°%s§.#Denkst du die nächste Zahl wird °>{button} höher ||call|/hol high<° oder °>{button} niedriger ||call|/hol low<°?", client.getHighOrLowNumber()));
        		} else {
        			client.sendButlerMessage(channel.getName(), String.format("%s Deine Startzahl ist _°18RR>{textborder}<°%s§.#Denkst du die nächste Zahl wird °>{button} höher ||call|/hol high<° oder °>{button} niedriger ||call|/hol low<°?", krzahl==10?"°BB°_Knuddelsrunde!§":"Neue Runde, neues Glück!",zahl));
        			client.increaseHighOrLowRound();
        			client.setHighOrLowNumber((byte)zahl);
        			
        			if(krzahl==10) {
        				client.setHolknuddelsrunde((byte)1);
        			}
        		}
        		
        		return;
        	}
        	
        	if(arg.equals("high")) {
        		if(runde == 0) {
        			client.sendButlerMessage(channel.getName(), "Du spielst kein High or Low. _°BB>Jetzt mitspielen!|/hol start<°");
        			return;
        		}
        		
        		if(client.getHighOrLowNumber() > zahl) {
        			highOrLowWrong(client, channel, client.getHighOrLowRound(), points, zahl);
        		} else {
        			client.sendButlerMessage(channel.getName(), String.format("°G°_Vollkommen richtig!§ _Runde %s_: Deine neue Zahl ist _°18RR>{textborder}<°%s§.#Denkst du die nächste Zahl wird °>{button} höher ||call|/hol high<° oder °>{button} niedriger ||call|/hol low<°?", runde+1, zahl));
        			client.setHighOrLowNumber((byte)zahl);
        			client.increaseHighOrLowRound();
        		}
        		
        		return;
        	}
        	
        	if(arg.equals("low")) {
        		if(client.getHighOrLowRound() == 0) {
        			client.sendButlerMessage(channel.getName(), "Du spielst kein High or Low. _°BB>Jetzt mitspielen!|/hol start<°");
        			return;
        		}
        		
        		if(client.getHighOrLowNumber() < zahl) {
    				highOrLowWrong(client, channel, client.getHighOrLowRound(), points, zahl);
        		} else {
        			client.sendButlerMessage(channel.getName(), String.format("°G°_Vollkommen richtig!§ _Runde %s_: Deine neue Zahl ist _°18RR>{textborder}<°%s§.#Denkst du die nächste Zahl wird °>{button} höher ||call|/hol high<° oder °>{button} niedriger ||call|/hol low<°?", runde+1, zahl));
        			client.setHighOrLowNumber((byte)zahl);
        			client.increaseHighOrLowRound();
        		}
        		return;
        	}
        	
        	client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/hol PARAMETER");
        } else if(cmd.equals("channel")) {
			if(!client.hasPermission("cmd.channel.minstatus") && !client.hasPermission("cmd.channel.size") && !client.hasPermission("cmd.channel.visible") && !client.hasPermission("cmd.channel.event") && !client.hasPermission("cmd.channel.addcm") && !client.hasPermission("cmd.channel.removecm") && !client.hasPermission("cmd.channel.lockfunction") && !client.hasPermission("cmd.channel.overview") && !client.hasPermission("cmd.channel.unlockfunction") && !channel.checkHz(client.getName())) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	} 
        	
        	String nickname = KCodeParser.escape(arg).split(":", 2)[0].toLowerCase();
            String msg = "";
            String info = "";
             
            if (arg.length() > nickname.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
        	if(nickname.isEmpty()) {
        		if(!client.hasPermission("cmd.channel.overview")) {
            		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            		return;
            	}
        		
        		String title = String.format("Informationen Channel %s", channel.getName());
        		StringBuilder c = new StringBuilder();

        		if(!channel.getOwner().isEmpty()) {
            		c.append("#_Besitzer_:°%40°").append(channel.getOwner()).append("°%00°");
        		}

        		if(channel.getTopic() != null) {
            		c.append("#_Topic_:°%40°").append(channel.getTopic()).append("°%00°§");
        		}
        		c.append("#_Size_:°%40°").append(channel.getSize()).append("°%00°");
        		c.append("#_Butler muted_:°%40°").append(channel.butlerMuted()?"Yes":"No").append("°%00°");

        		c.append("#_Youth Protection_:°%40°").append(channel.getJuSchu()==1?"On":"Off").append("°%00°");
        		if(channel.getMinage() != 0) {
            		c.append("#_Age Restriction_:°%40°").append(channel.getMinage()).append("°%00°");
        		}
        		
        		c.append("#_Minstatus_:°%40°").append(channel.getMinRank()).append("°%00°");
        		c.append("#_Visible_:°%40°").append(channel.isVisible() ? "Sichtbar" : "Unsichtbar").append("°%00°");
        		c.append("#_Special Event_:°%40°").append(channel.getSpecialEvent() == 1 ? "Aktiviert" : "Deaktiviert").append("°%00°");
        		c.append("#_Ever_:°%40°").append(!channel.isVisible() && channel.getTemp() == 1 ? "Aktiviert" : "Deaktiviert").append("°%00°");
        		c.append("#_Moderiert_:°%40°").append(channel.isModerated() ? "Aktiviert" : "Deaktiviert").append("°%00°");
        		c.append("#_Edit Status_:°%40°6°%00°");
            	
        		if(!channel.getBannedFunctions().isEmpty()) {
        			c.append("#_Locked Functions_:°%40°").append(channel.getBannedFunctions().replace("||", ", ").replace("|", "")).append("°%00°");
        		}
        		
                
                if(!channel.getCms().isEmpty()) {
                	c.append("#_CMs_:°%40°").append(channel.getCms().replace("||", ", ").replace("|", "")).append("°%00°");
                }
                
                if(!channel.getHZ().isEmpty()) {
                	c.append("#_HZA/E_:°%40°").append(channel.getHZ().replace("||", ", ").replace("|", "")).append("°%00°");
                }
        		
                c.append("##_°BB>Channelinfo bearbeiten|/channelrules ").append(channel.getName()).append("<r°_");
        		
        		client.send(Popup.create(title, title, c.toString(), 400, 250));
        		return;
        	}
        	
        	if(nickname.startsWith("-")) {
        		if(!nickname.startsWith("-cm")) {
        			if(!client.hasPermission("cmd.channel.unlockfunction") && !channel.checkHz(client.getName())) {
                		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                		return;
                	} 
            		
        			String function = nickname.substring(1).trim();
        		
        			if(function.isEmpty()) {
        				client.sendButlerMessage(channel.getName(), "Falscher Parameter");
        			} else if(channel.getBannedFunctions().contains(String.format("|%s|", function))) {
        				client.sendButlerMessage(channel.getName(), String.format("Die Funktion %s ist bereits gesperrt.", function));
        			} else {
        				client.sendButlerMessage(channel.getName(), String.format("Die _Funktion %s_ wurde für den Channel %s _gesperrt_.", function, channel.getName()));
        				channel.setBannedFunctions(String.format("%s|%s|", channel.getBannedFunctions(), function));
        			}
        		
        			return;
        		}
        	}
        	
        	if(nickname.startsWith("+")) {
        		if(!nickname.startsWith("+cm")) {
        			if(!client.hasPermission("cmd.channel.lockfunction")) {
                		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                		return;
                	}
        		
        			String function = nickname.substring(1).trim().toLowerCase();
        		
        			if(function.isEmpty()) {
        				client.sendButlerMessage(channel.getName(), "Falscher Parameter");
        			} else if(!channel.getBannedFunctions().contains(String.format("|%s|", function))) {
        				client.sendButlerMessage(channel.getName(), String.format("Die Funktion %s ist nicht gesperrt.", function));
        			} else if(function.equals("io") || function.equals("po")) {
        				client.sendButlerMessage(channel.getName(), String.format("Die Funktion %s kann nicht gesperrt werden.", function));
        			} else {
        				client.sendButlerMessage(channel.getName(), String.format("Die _Funktion %s_ wurde _entsperrt_.", function));
        				channel.setBannedFunctions(channel.getBannedFunctions().replace(String.format("|%s|", function), ""));
        			}
        			
        			return;
        		}
        	}
        	
        	if(msg.isEmpty()) {
        		client.sendButlerMessage(channel.getName(), info);
        		return;
        	}
        	
        	String timeString = new SimpleDateFormat("M/yy").format(new Date());
        	
        	if(nickname.equals("+cm")) {
            	if(!client.hasPermission("cmd.channel.addcm")) {
            		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            		return;
            	}
            	
        		Client target = Server.get().getClient(msg);
        		boolean online = true;
        		
        		if(target == null) {
        			online = false;
        			target = new Client(null);
        			target.loadStats(msg);
        			
        			if(target.getName() == null) {
        				client.sendButlerMessage(channel.getName(), unknownUser(msg));
        				return;
        			}
        		}
        		
        		if(channel.checkCm(target.getName())) {
        			client.sendButlerMessage(channel.getName(), String.format("%s ist bereits im Channel %s CM!", target.getName(), channel.getName()));
        			return;
        		}
        		
        		if(!target.hasPermission("becomecm")) {
        			client.sendButlerMessage(channel.getName(), "Du kannst den User nicht zum CM ernennen.");
        			return;
        		}

    			client.sendButlerMessage(channel.getName(), String.format("%s wurde als CM im Channel %s gesetzt.", target.getName(), channel.getName()));
    			Server.get().newMessage(Server.get().getButler(), target.getName(), String.format("Channelmoderator im %s", channel.getName()), String.format("Hallo %s,##dir wurden soeben im Channel %s von %s Channelmoderatorenrechte gesetzt.##Hochachtungsvoll,#%s", target.getName(), channel.getName(), client.getName(), Server.get().getButler().getName()), time);
    			
    			addIcon("pics/cm.png", 20, target, channel);
    			
    			channel.setCms(String.format("%s|%s|", channel.getCms(), target.getName()));
    			target.setComment(time, null, null, client.getName(), String.format("CM-Rechte im Channel %s gesetzt", channel.getName()));
    			
    			if(!target.getCmwhen().contains(timeString) && channel.isVisible()) {
    				if(online) {
    					target.setCmwhen(String.format("%s%s%s",target.getCmwhen(), target.getCmwhen().isEmpty()?"":", ", timeString));
    				} else {
    					Server.get().query(String.format("update accounts set cmMonths=cmMonths+'1', cmwhen='%s%s%s' where name='%s'", target.getCmwhen(), target.getCmwhen().isEmpty()?"":", ", timeString, target.getName()));
    				}
    			}
    			
    			return;
        	}
        	
        	if(nickname.equals("-cm")) {
            	if(!client.hasPermission("cmd.channel.removecm") && !channel.checkHz(client.getName())) {
            		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            		return;
            	}
            	
        		Client target = Server.get().getClient(msg);
        		boolean online = true;
        		
        		if(target == null) {
        			online = false;
        			target = new Client(null);
        			target.loadStats(msg);
        			
        			if(target.getName() == null) {
        				client.sendButlerMessage(channel.getName(), unknownUser(msg));
        				return;
        			}
        		}
        		
        		if(!channel.checkCm(target.getName())) {
        			client.sendButlerMessage(channel.getName(), String.format("%s ist kein Channelmoderator!", target.getName()));
        			return;
        		}

    			client.sendButlerMessage(channel.getName(), String.format("%s wurden die Channelmoderatorenrechte entzogen.", target.getName(), channel.getName()));
    			Server.get().newMessage(Server.get().getButler(), target.getName(), String.format("Channelmoderatorenrechte entzogen", channel.getName()), String.format("Hallo %s,##dir wurden soeben im Channel %s von %s die Channelmoderatorenrechte entzogen.##Hochachtungsvoll,#%s", target.getName(), channel.getName(), client.getName(), Server.get().getButler().getName()), time);

    			if(online) {
    				removeIcon("pics/cm.png", target.getName(), channel);
    			}
    			
				if(target.getCmwhen().contains(timeString)) {
					if(online) {
						target.setCmwhen(target.getCmwhen().replace(String.format(", %s", timeString), "").replace(timeString, ""));
					} else {
						Server.get().query(String.format("update accounts set cmMonths=cmMonths-'1',cmwhen='%s' where name='%s'", target.getCmwhen().replace(String.format(", %s", timeString), "").replace(timeString, ""), target.getName()));
    				}
				}
    			
    			
    			channel.setCms(channel.getCms().replace(String.format("|%s|", target.getName()), ""));
    			target.setComment(time, null, null, client.getName(), String.format("CM für %s _entzogen!_", channel.getName()));
    			return;
        	}

        	if(nickname.equals("minstatus")) {
        		if(!client.hasPermission("cmd.channel.minstatus")) {
            		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            		return;
            	}

        		try {
        			Integer.parseInt(msg);
        		} catch (Exception ex) {
        			client.sendButlerMessage(channel.getName(), "Falscher Parameter.");
        			return;
        		}
        		
        		int msgInt = Integer.parseInt(msg);
        		
        		if(msgInt < 0 || msgInt > 11) {
        			client.sendButlerMessage(channel.getName(), "Falscher Parameter.");
        			return;
        		}

    			client.sendButlerMessage(channel.getName(), String.format("Minstatus geändert auf %s (%s).", msg, client.getRankLabel(Byte.parseByte(msg))));
        		channel.setMinRank(msgInt);
        		return;
        	}
        	
        	if(nickname.equals("size")) {
            	if(!client.hasPermission("cmd.channel.size")) {
                    client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                    return;
            	}
            	
        		try {
        			Integer.parseInt(msg);
        		} catch (Exception ex) {
        			client.sendButlerMessage(channel.getName(), "Falscher Parameter");
        			return;
        		}

    			client.sendButlerMessage(channel.getName(), String.format("Size geändert auf %s.", msg));
        		channel.setSize(Integer.parseInt(msg));
        		return;
        	}
        	
        	if(nickname.equals("event")) {
            	if(!client.hasPermission("cmd.channel.event")) {
                    client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                    return;
            	}
            	
        		if(msg.toLowerCase().equals("on".toLowerCase())) {
        			client.sendButlerMessage(channel.getName(), "Special Event aktiviert.");
        			channel.setSpecialEvent(1);
        			return;
        		}
        		
        		if(msg.toLowerCase().equals("off".toLowerCase())) {
        			client.sendButlerMessage(channel.getName(), "Special Event deaktiviert.");
        			channel.setSpecialEvent(0);
        			return;
        		}
        		
    			client.sendButlerMessage(channel.getName(), "Falscher Parameter");
        		return;
        	}
        	
        	if(nickname.equals("visible")) {
            	if(!client.hasPermission("cmd.channel.visible")) {
                    client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                    return;
            	}
            	
        		if(msg.toLowerCase().equals("on".toLowerCase())) {
        			client.sendButlerMessage(channel.getName(), "Der Channel ist nun _sichtbar_.");
        			channel.setVisible(1);
        			return;
        		}
        		
        		if(msg.toLowerCase().equals("off".toLowerCase())) {
        			client.sendButlerMessage(channel.getName(), "Der Channel ist nun _unsichtbar_.");
        			channel.setVisible(0);
        			return;
        		}
        		
    			client.sendButlerMessage(channel.getName(), "Falscher Parameter");
        		return;
        	}
        	
    		client.sendButlerMessage(channel.getName(), info);
        } else if(cmd.equals("fa")) {
        	if(!client.hasPermission("cmd.fa") && !channel.checkCm(client.getName()) && !channel.checkHz(client.getName())) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	

            String typ = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            
            if (arg.length() > typ.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
        	
            if(typ.equalsIgnoreCase("edit")) {
            	if(msg.length() < 2) {
            		return;
            	}
            	
            	String rightTeam = Settings.getTeam(msg);
            	
            	if(!Settings.checkTeam(msg)) {
            		client.sendButlerMessage(channel.getName(), String.format("Das Team _%s existiert nicht_.", msg));
            		return;
            	}
            	
            	if(!client.checkTeamLeader(msg) && client.getRank() < 11) {
            		client.sendButlerMessage(channel.getName(), String.format("Du bist kein Teamleiter im Team %s.", rightTeam));
            		return;
            	}
            	
            	StringBuilder team = new StringBuilder();
            	String title = String.format("Team %s - Übersicht", rightTeam);

            	List<String> mitglieder = new ArrayList<String>();
            	List<String> teamleiter = new ArrayList<String>();

    			PoolConnection pcona = ConnectionPool.getConnection();
                PreparedStatement psa = null;
            
                try {
                    Connection cona = pcona.connect();
                    psa = cona.prepareStatement("SELECT `teams`,`name` FROM `accounts` WHERE `teams` != ''");
                    ResultSet rsa = psa.executeQuery();
                
                    while(rsa.next()) {
                        String tea = rsa.getString("teams").toLowerCase();
                        String name = rsa.getString("name");
                        
                        if(tea.contains(String.format("|%s~1|", rightTeam.toLowerCase()))) {
                        	teamleiter.add(name);
                        } else if(tea.contains(String.format("|%s~0|", rightTeam.toLowerCase()))) {
                            mitglieder.add(name);
                        }
                    }    
                }catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    if (psa != null) {
                        try {
                            psa.close();
                        } catch (SQLException e) {
                        }
                    }

                    pcona.close();
                }
            	
            	team.append("°>finger.b.gif<° Teamleiter:#");
            	
            	if(teamleiter.size() == 0) {
            		team.append("# °>cc/bullet_blue_outlined.png<° Keine");
            	} else {
            		for(String nick : teamleiter) {
            			Client c = Server.get().getClient(nick);
            			
            			if(c == null) {
            				c = new Client(null);
            				c.loadStats(nick);
            			}
            			
            			team.append("# °>cc/bullet_blue_outlined.png<° _°BB>_h").append(c.getName()).append("|/serverpp \"|/w \"<° (").append(c.getAge()).append(")°>").append(c.getGender() == 2 ? "fe":"").append("male.png<r°_°%35°(").append(c.getRankLabel(c.getRank())).append(", ").append(c.getTimeMonth()/60).append(" Minuten in diesem Monat)°%00°");
            		}
            	}
            	
            	team.append("##°>finger.b.gif<° Mitglieder:#");
            	
            	if(mitglieder.size() == 0) {
            		team.append("# °>cc/bullet_blue_outlined.png<° Keine");
            	} else {
            		for(String nick : mitglieder) {
            			Client c = Server.get().getClient(nick);
            			
            			if(c == null) {
            				c = new Client(null);
            				c.loadStats(nick);
            			}
            			
            			team.append("# °>cc/bullet_blue_outlined.png<° _°BB>_h").append(c.getName()).append("|/serverpp \"|/w \"<° (").append(c.getAge()).append(")°>").append(c.getGender() == 2 ? "fe":"").append("male.png<r°_°%35°(").append(c.getRankLabel(c.getRank())).append(", ").append(c.getTimeMonth()/60).append(" Minuten in diesem Monat)°%00°");
            		}
            	}

                Popup popup = new Popup(title, title, team.toString(), 600, 300);
                Panel panel2 = new Panel();
                Button button = new Button("Teaminfo");
                button.setStyled(true);
                button.enableAction();
                button.disableClose();
                panel2.addComponent(button);
                Button button2 = new Button("Mitglieder");
                button2.setStyled(true);
                button2.enableAction();
                button2.disableClose();
                panel2.addComponent(button2);
                Button button3 = new Button("RundMail");
                button3.setStyled(true);
                button3.enableAction();
                button3.disableClose();
                panel2.addComponent(button3);
                popup.addPanel(panel2);
                        
                popup.setOpcode(ReceiveOpcode.FA.getValue(), rightTeam);
                client.send(popup.toString());
            	return;
            }
            
        	if(arg.equals("?")) {
        		StringBuilder fa = new StringBuilder("Es existieren folgende Teams:#");
        		
        		for(String team : Settings.getTeams().split("\\|")) {
        			if(!team.isEmpty()) {
        				fa.append("#_°BB>").append(team).append("|/fa \"|/h \"-team<r°_");
        			}
        		}
        		
        		String title = "Teamübersicht";
        		client.send(Popup.create(title, title, fa.toString(), 400, 250));
        		return;
        	}
        	
        	if(arg.equals("sort:0")) {
        		client.setFaSort((byte)0);
        	} else if(arg.equals("sort:1")) {
            	client.setFaSort((byte)1);
            }
        	
        	List<String> lol = new ArrayList<String>();
        	int lala = 0;
        	StringBuilder fa = new StringBuilder();

            for (Object target : Server.get().getClients().toArray()) {
            	Client cl = ((Client) target);

    			if(cl != Server.get().getButler()) {
    				if(cl.getRank() > 5) {
    					lol.add(cl.getName());
    					lala++;
    				}
    			}
            }

        	if(lala == 0) {
        		client.sendButlerMessage(channel.getName(), "Momentan sind keine Admins online.");
        		return;
        	}
            
            if(client.getFaSort() == 0) {
        		Collections.shuffle(lol);
            } else {
            	Collections.sort(lol);
            }
        	
        	for(String nick : lol) {
        		Client c = Server.get().getClient(nick);
        		
				fa.append("#°>py_g.gif<°°%06°_°>_h").append(nick.replace("<", "\\<")).append("|/serverpp \"|/w \"<°_ ist im Channel _");
				
				if(c.getChannel().isVisible()) { 
					fa.append("°>_h").append(c.getChannel().getName()).append("|/go \"|/go +\"<°");
				} else {
					fa.append("?");
				}
				
				fa.append("°E° ONLINE_°r°!");
				
                if(c.isAway()) {
                	if(c.getRank() > 7) {
                    	fa.append(" °>icon_away_ani_new.gif<°");
                	}else {
                		fa.append(" °>away.png<°");
                	}
                }
				
				if(c.getReadme() != null) {
					fa.append("#°%06°\"\"").append(Server.get().parseSmileys(c, c.getReadme())).append("§\"\"");
                }
				
				fa.append("°%00°");
        	}

        	String title = String.format("Adminliste (%s)", lala);
        	
        	Popup popup = new Popup(title, title, fa.toString(), 550, 250);
        	popup.setButtonFontSize(18);
            Panel panel = new Panel();

            Button buttonMessage = new Button("   OK   ");
            buttonMessage.setStyled(true);
            panel.addComponent(buttonMessage);

            Button buttonMessage2 = new Button(client.getFaSort()==0?"Sortiert":"Zufällig");
            buttonMessage2.setCommand(String.format("/fa sort:%s", client.getFaSort()==0?1:0));
            buttonMessage2.setStyled(true);
            panel.addComponent(buttonMessage2);
            
            popup.addPanel(panel);
            client.send(popup.toString());
        }else if(cmd.equals("ban")) {
        	if(!client.hasPermission("cmd.ban")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung");
        		return;
        	}
        	
        	String nickname = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            String info = "Bitte die Funktion folgendermaßen benutzen:#/ban NICK:COMMENT oder !IP-ADRESSE#(Sperrt die IP-Adresse von NICK und setzt COMMENT als Adminkommentar oder löscht die IP-Adresse wieder von der Banlist.)";
            boolean ent = false;
             
            if (arg.length() > nickname.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            if (!nickname.isEmpty() && arg.startsWith("!")) {
            	ent = true;
                nickname = nickname.substring(1).trim();
            }
            
            if(nickname.isEmpty()) {
            	client.sendButlerMessage(channel.getName(), Settings.getBan().isEmpty() ? "Momentan sind keine IP's gesperrt." : String.format("Folgende IP's sind momentan gesperrt:#%s", Settings.getBan().replace("||", ", ").replace("|", "")));
            	return;
            }
            
            if(ent && msg.isEmpty()) {
            	if(!Settings.getBan().contains(String.format("|%s|", nickname))) {
            		client.sendButlerMessage(channel.getName(), String.format("Die IP ist momentan nicht gesperrt!", msg));
            	}else {
            		client.sendButlerMessage(channel.getName(), String.format("Die IP %s wurde entsperrt.", nickname));
            		Settings.setBan(Settings.getBan().replace(String.format("|%s|", nickname), ""));
            	}

            	return;
            }
            
            if(msg.isEmpty()) {
            	client.sendButlerMessage(channel.getName(), info);
            	return;
            }
            
            Client target = Server.get().getClient(nickname);
            
            if(target == null) {
            	target = new Client(null);
            	target.loadStats(nickname);
            	
            	if(target.getName() == null) {
            		client.sendButlerMessage(channel.getName(), unknownUser(nickname));
            		return;
            	}
            }
            
            if(target.getRank() >= client.getRank() || target == client || target == Server.get().getButler()) {
            	client.sendButlerMessage(channel.getName(), String.format("Du kannst die IP-Adresse von %s nicht sperren!", target.getName()));
            	return;
            }

            if(Settings.getBan().contains(String.format("|%s|", target.getIPAddress()))) {
            	client.sendButlerMessage(channel.getName(), String.format("Die IP-Adresse von %s ist bereits gesperrt!", target.getName()));
            	return;
            }
            
            client.sendButlerMessage(channel.getName(), String.format("Die IP-Adresse von %s wurde gesperrt.", target.getName()));
            Settings.setBan(String.format("%s|%s|", Settings.getBan(), target.getIPAddress()));
            target.setComment(time, null, "IP gesperrt!", client.getName(), msg);
        } else if (cmd.equals("channelrules")) {
        	if(!client.hasPermission("cmd.channelrules") && !channel.checkHz(client.getName())) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}

            arg = KCodeParser.escape(arg);
            Channel channelTo = arg.isEmpty()?channel:Server.get().getChannel(arg);
                
            if (channelTo == null) {
                client.sendButlerMessage(channel.getName(), String.format("Der Channel _%s existiert nicht_.", arg));
                return;
            }
            
            Popup popup = new Popup(String.format("Channelinfo %s bearbeiten", channelTo.getName()), String.format("Channelinfo %s bearbeiten", channelTo.getName()), "", 0, 0);
            Panel panel7 = new Panel();
            TextArea ae = new TextArea(15, 50);
            ae.setText(channel.getInfo());
            panel7.addComponent(ae);
            popup.addPanel(panel7);
            Panel panel2 = new Panel();
            Button button = new Button("Speichern");
            button.setStyled(true);
            button.enableAction();
            button.disableClose();
            panel2.addComponent(button);
            Button button3 = new Button("Schließen");
            button3.setStyled(true);
            panel2.addComponent(button3);
            popup.addPanel(panel2);    
            popup.setOpcode(ReceiveOpcode.CHANNELRULES.getValue(), channelTo.getName());
            client.send(popup.toString());
        }else if(cmd.equals("admincall") || cmd.equals("notruf")) {
        	if(!client.hasPermission(String.format("cmd.%s", cmd))) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
        	
        	if(arg.equals("-") || arg.isEmpty()) {
            	client.send(PacketCreator.createAdminCallWindow());
        		return;
        	}
        	
        	if(arg.equals("help")) {
        		parse("/h", client, channel, false);
        		return;
        	}
        	
        	String nickname = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
             
            if (arg.length() > nickname.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            if(msg.isEmpty() || nickname.isEmpty()) {
            	return;
            }
            
            if(nickname.equals("complaint")) {
        		client.send(PacketCreator.createAdmincallWindow(msg, "", ""));
            	return;
            }
            
            if(nickname.equals("info")) {
            	PoolConnection pcon = ConnectionPool.getConnection();
                Statement ps = null;

                try {
                    Connection con = pcon.connect();
                    ps = con.createStatement();
                    ResultSet rs = ps.executeQuery(String.format("SELECT `id`, `ergebnis`, `bewertet`, `channel`, `abgesetzt`, `angenommen`, `bearbeiter`, `beschuldigter`, `beschwerdeführer`, `verstoss`, `begründung` FROM `admincalls` WHERE `id` = '%s'", msg));
                    
                    if(!rs.next()) {
                    	client.sendButlerMessage(channel.getName(), String.format("Es existiert kein Notruf mit der ID %s!", msg));
                    } else {
                    	String beschuldigter = rs.getString("beschuldigter");
                    	String beschwerdeführer = rs.getString("beschwerdeführer");
                    	String verstoß = rs.getString("verstoss");
                    	String begründung = rs.getString("begründung");
                    	String bearbeiter = rs.getString("bearbeiter");
                    	String channe = rs.getString("channel");
                    	long abgesetzt = rs.getLong("abgesetzt");
                    	String ergebnis = rs.getString("ergebnis");
                    	long bewertet = rs.getLong("bewertet");
                    	long angenommen = rs.getLong("angenommen");
                    	
                    	if(!client.getName().equals(beschuldigter) && !client.getName().equals(bearbeiter) && !client.hasPermission("seeadmincalls")) {
                    		client.sendButlerMessage(channel.getName(), "Du kannst diesen Notruf nicht einsehen!");
                    		return;
                    	}

                    	String title = String.format("Informationen zum Notruf *%s", msg);
                    	StringBuilder xd = new StringBuilder();
                    	Client bf = Server.get().getClient(beschwerdeführer);
                    	Client b = Server.get().getClient(beschuldigter);
                    	StringBuilder ereignislog = new StringBuilder();
                    	boolean bfo = true;
                    	boolean bo = true;
                    	
                    	if(bf == null) {
                    		bfo = false;
                    		bf = new Client(null);
                    		bf.loadStats(beschwerdeführer);
                    	}
                    	
                    	if(b == null) {
                    		bo = false;
                    		b = new Client(null);
                    		b.loadStats(beschuldigter);
                    	}

                    	xd.append("_ID_:°%40°").append(msg).append("°%00°#");
                    	xd.append("_Verstoß_:°%40°").append(verstoß).append("°%00°#");
                    	
                    	if(!ergebnis.isEmpty()) {
                        	xd.append("_Bewertet als_:°%40°").append(ergebnis).append("°%00°#");
                    	}
                    	
                    	xd.append("_Channel_:_°BB%40>_h").append(channe).append("|/go \"|/go +\"<r%00°_#");
                    	xd.append("_Beschwerdeführer_:_°%40BB>_h").append(bf.getName().replace("<", "\\<")).append("|/serverpp \"|/w \"<r°_ (").append(bf.getAge()).append(")");
                    	
                    	if(bf.getGender() == 1) {
                    		xd.append("°>male.png<°");
                    	} else {
                    		xd.append("°>female.png<°");
                    	}

                    	if(bearbeiter.equals(client.getName())) {
                    		xd.append("#(").append(bf.getRankLabel(bf.getRank())).append(", ").append(nf.format(bf.getOnlineTime()/60)).append(" Minuten (Reg.: ").append(bf.getRegistrationDate()).append(" ").append(bf.getRegistrationTime()).append("), ").append(bfo ? "_Online_" : "Offline").append(")");
                    	}
                    	
                    	xd.append("°%00°#_Beschuldigter_:_°%40BB>_h").append(b.getName().replace("<", "\\<")).append("|/serverpp \"|/w \"<r°_ (").append(b.getAge()).append(")");
                    	
                    	if(b.getGender() == 1) {
                    		xd.append("°>male.png<°");
                    	} else {
                    		xd.append("°>female.png<°");
                    	}
                    	
                    	if(bearbeiter.equals(client.getName())) {
                    		xd.append("#(").append(b.getRankLabel(b.getRank())).append(", ").append(nf.format(b.getOnlineTime()/60)).append(" Minuten (Reg.: ").append(b.getRegistrationDate()).append(" ").append(b.getRegistrationTime()).append("), ").append(bo ? "_Online_" : "Offline").append(")");
                    	}
                    	
                    	xd.append("°%00#°");
                    	
                    	ereignislog.append("#_").append(Server.get().timeStampToTime(abgesetzt)).append("_: Notruf abgesetzt");
                    	
                    	if(!bearbeiter.isEmpty()) {
                    		xd.append("_Zugewiesen_:_°BB%40>_h").append(bearbeiter.replace("<", "\\<")).append("|/go \"|/go +\"<r%00°_#°%00°");
                    		
                    		ereignislog.append("#_").append(Server.get().timeStampToTime(angenommen)).append("_: Notruf zugewiesen");
                    	}
                    	
                    	if(!ergebnis.isEmpty()) {
                    		ereignislog.append("#_").append(Server.get().timeStampToTime(bewertet)).append("_: Fall abgeschlossen");
                    	}

                    	xd.append("#_Ereignislog_:°%40°_").append(Server.get().timeStampToDate(abgesetzt)).append("_").append(ereignislog.toString().isEmpty() ? "" : String.format("#%s", ereignislog.toString())).append("°%00°#");
                    	
                    	xd.append("_Begründung_:##").append(begründung);
                    	
                        Popup popup = new Popup(title, title, xd.toString(), 550, 350);
                        
                        if(bearbeiter.equals(client.getName()) && ergebnis.isEmpty()) {
                        	Panel panel2 = new Panel();
                        	String[] lala = {"Notruf berechtigt", "Notruf unberechtigt", "Notruf-Missbrauch"};
                        	panel2.addComponent(new Label(String.format("Bewerten als:")));
                        	panel2.addComponent(new Choice(lala, verstoß));
                        	popup.addPanel(panel2);
                        }
                        
                        Panel panel5 = new Panel();
                        Button button = new Button("   OK   ");
                        button.setStyled(true);
                        
                        if(bearbeiter.equals(client.getName()) && ergebnis.isEmpty()) {
                            button.enableAction();
                        	popup.setOpcode(ReceiveOpcode.ADMINCALL.getValue(), String.format("lala~%s", msg));
                        }
                        panel5.addComponent(button);
                        popup.addPanel(panel5);
                        
                        client.send(popup.toString());
                    }
                    
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    if (ps != null) {
                        try {
                            ps.close();
                        } catch (SQLException e) {
                        }
                    }

                    pcon.close();
                }
                
            	return;
            }
            
            if(nickname.equals("ok")) {
            	PoolConnection pcon = ConnectionPool.getConnection();
                Statement ps = null;

                try {
                    Connection con = pcon.connect();
                    ps = con.createStatement();
                    ResultSet rs = ps.executeQuery(String.format("SELECT `id`, `bearbeiter`, `beschwerdeführer`, `beschuldigter` FROM `admincalls` WHERE `id` = '%s'", msg));
                    
                    if(!rs.next()) {
                    	client.sendButlerMessage(channel.getName(), String.format("Es existiert kein Notruf mit der ID %s!", msg));
                    } else {
                		Client nrs = Server.get().getNRS();
                		if(nrs == null) {
                			nrs = new Client(null);
                			nrs.loadStats("Notruf-System");
                		}
                		
                    	String bearbeiter = rs.getString("bearbeiter");
                    	String beschwerdeführer = rs.getString("beschwerdeführer");
                    	String beschuldigter = rs.getString("beschuldigter");
                    	
                    	if(!bearbeiter.isEmpty()) {
                    		client.sendButlerMessage(channel.getName(), String.format("%s den Notruf bereits angenommen. %s", bearbeiter.equals(client.getName()) ? "Du hast" : String.format("%s hat", bearbeiter), bearbeiter.equals(client.getName()) ? String.format("(_°BB>Informationen|/admincall info:%s<r°_)", msg) : ""));
                    		return;
                    	}

                    	client.sendButlerMessage(channel.getName(), String.format("Du hast den _Notruf angenommen_. (_°BB>Informationen|/admincall info:%s<r°_)", msg));
                    	Server.get().query(String.format("UPDATE `admincalls` SET `bearbeiter` = '%s', angenommen = '%s' WHERE `id` = '%s'", client.getName(), System.currentTimeMillis()/1000, msg));
                    	parse(String.format("/admincall info:%s", msg), client, channel, false);
                    	Server.get().newMessage(nrs, beschuldigter, "", String.format("Die Bearbeitung der über Sie eingegangenen _Beschwerde °BB>_h*%s|/admincall info:%s<r°_ wurde soeben an _den Admin °BB>_h%s|/serverpp \"/w \"<r°_ zur Bearbeitung übergeben.##_°BB>_h%s|/serverpp \"/w \"<r°_ wird den Notruf nun prüfen und entscheiden.", msg, msg, bearbeiter.isEmpty()?client.getName():bearbeiter, bearbeiter.isEmpty()?client.getName():bearbeiter), System.currentTimeMillis()/1000);
                    	Server.get().newMessage(nrs, beschwerdeführer, "", String.format("Die Bearbeitung des von Ihnen gemeldeten _°BB>_hNotrufs *%s|/admincall info:%s<r°_ wurde soeben an _den Admin °BB>_h%s|/serverpp \"|/w \"<r°_ zur Bearbeitung übergeben.##_°BB>_h%s|/serverpp \"|/w \"<r°_ wird den Notruf nun prüfen und entscheiden.##Sie werden nach Abschluss der Bearbeitung über die Entscheidung informiert werden. Unter dem obigen Notruf-Link können Sie den aktuellen Bearbeitungszustand verfolgen.",msg, msg, bearbeiter.isEmpty()?client.getName():bearbeiter,bearbeiter.isEmpty()?client.getName():bearbeiter), System.currentTimeMillis()/1000);
                		
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    if (ps != null) {
                        try {
                            ps.close();
                        } catch (SQLException e) {
                        }
                    }

                    pcon.close();
                }
                
            	return;
            }
            
        } else if(cmd.equals("delphoto")) {
        	if(!client.hasPermission("cmd.delphoto")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	String recipients = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            String info = "Bitte die Funktion folgendermaßen benutzen:#/delphoto NICK:COMMENT#(Löscht das Foto von NICK und setzt COMMENT als Adminkommentar bei NICK.)";
            
            if (arg.length() > recipients.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            if (recipients.isEmpty() || msg.isEmpty()) {
                client.sendButlerMessage(channel.getName(), info); 
                return;
            }
            
            Client target = Server.get().getClient(recipients);
            boolean online = true;
            
            if(target == null) {
            	online = false;
            	target = new Client(null);
            	target.loadStats(recipients);
            	
            	if(target.getName() == null) {
            		client.sendButlerMessage(channel.getName(), unknownUser(recipients));
            		return;
            	}
            }
            
            if(target == client) {
            	client.sendButlerMessage(channel.getName(), "Du kannst dein eigenes Foto nicht löschen.");
            	return;
            }
            
            if(target.getRank() >= 4) {
            	client.sendButlerMessage(channel.getName(), String.format("Du kannst das Foto von %s nicht löschen.", target.getName()));
            	return;
            }
            
            if(target.getPhoto().isEmpty()) {
            	client.sendButlerMessage(channel.getName(), String.format("%s hat kein Foto hochgeladen.", target.getName()));
            	return;
            }
            
            client.sendButlerMessage(channel.getName(), String.format("Das Foto von %s wurde gelöscht.", target.getName()));
            Server.get().newMessage(Server.get().getButler(), target.getName(), "Foto gelöscht", String.format("Dein Foto wurde von %s aufgrund eines Verstoßes gelöscht.", client.getName()), time);
            
            if(online) {
            	target.setPhoto("");
            }else {
            	Server.get().query(String.format("UPDATE `accounts` SET `photo` = '' where name = '%s'", target.getName()));
            }
            target.setComment(time, null, "Foto gelöscht!", client.getName(), msg);
        }else if(cmd.equals("clearw")) {
        	if(!client.hasPermission("cmd.clearw")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	String recipients = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            String info = "Bitte die Funktion folgendermaßen benutzen:#/clearw NICK:COMMENT#(Löscht die Profilangaben sowie die Nachrichtensignatur von NICK und setzt COMMENT als Adminkommentar bei NICK.)";
            
            if (arg.length() > recipients.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            if (recipients.isEmpty() || msg.isEmpty()) {
                client.sendButlerMessage(channel.getName(), info); 
                return;
            }
            
            Client target = Server.get().getClient(recipients);
            boolean online = true;
            
            if(target == null) {
            	online = false;
            	target = new Client(null);
            	target.loadStats(recipients);
            	
            	if(target.getName() == null) {
            		client.sendButlerMessage(channel.getName(), unknownUser(recipients));
            		return;
            	}
            }
            
            if(target == client) {
            	client.sendButlerMessage(channel.getName(), "Du kannst dein eigenes Profil nicht leeren!");
            	return;
            }
            
            if(target.getRank() >= client.getRank()) {
            	client.sendButlerMessage(channel.getName(), String.format("Du kannst das Profil von %s nicht leeren!", target.getName()));
            	return;
            }
            
            client.sendButlerMessage(channel.getName(), String.format("Das Profil von %s wurde geleert.", target.getName()));
            
            if(online) {
            	target.setStadt("");
            	target.setLand("");
            	target.setHobbys("");
            	target.setRealName("");
            	target.setJob("");
            	target.setMotto("");
            	target.setSignatur("");
                target.setLike("");
            	target.setReadme(null);
            }else {
            	Server.get().query(String.format("UPDATE `accounts` SET `realname` = '', `stadt` = '', `signature` = '', `land` = '', `hobbys` = '', `job` = '', `motto` = '', `like` = '', readme=NULL where name = '%s'", target.getName()));
            }
            target.setComment(time, null, "ClearW!", client.getName(), msg);
        } else if(cmd.equals("cmtest")) {
        	if(!client.hasPermission("cmd.cmtest")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	if(arg.equalsIgnoreCase("iplist")) {
        		StringBuilder list = new StringBuilder();
        		
        		
        		
        		client.send(Popup.create("IPList", "IPList", list.toString(), 400, 250));		
        		return;
        	}
        	
        	StringBuilder cmtest = new StringBuilder();
        	cmtest.append("Bevor Du auf die CM-Nominierungsliste kommst, musst Du Deine Fähigkeiten als CM mit Bestehen des CM-Tests beweisen.##- Studiere vor dem CM-Test intensiv die CM-Doku: _°B>http://inetchat.sytes.net/cmdoku|\"<r°_#- Der CM-Test besteht aus _20 Multiple-Choice Fragen_#- Du hast _pro Frage zwei Minuten_ Zeit, danach öffnet sich die nächste Frage#- Der Test dauert ca. _30 Minuten_#- Der Test ist bestanden, wenn Du _weniger als 5 Fehler_ machst#- Du hast _nur zwei Versuche_, den Test zu bestehen#- Ein _Bestehen bis zum 01.01.2012_ ist Voraussetzung für die CM-Wahlen#- °R°_Niemand darf Dir beim CM-Test helfen und Du darfst nicht über die gestellten Fragen sprechen oder mit mehr als einem Nick teilnehmen, sonst wird Dein Nick für immer gesperrt");
            Popup popup = new Popup("Infos zum CM-Test", "Infos zum CM-Test", cmtest.toString(), 400, 250);
            Panel panel2 = new Panel();
            Button button = new Button("CM-Test starten");
            button.setStyled(true);
            button.enableAction();
            panel2.addComponent(button);
            popup.addPanel(panel2);
                    
            popup.setOpcode(ReceiveOpcode.CMTEST.getValue(), "cmtest");
            client.send(popup.toString());
        } else if(cmd.equals("sug")) {
        	if(!client.hasPermission("cmd.sug")) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
        	
        	String election = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String name = "";
            
            if (arg.length() > election.length()) {
                name = arg.substring(arg.indexOf(':') + 1);
            }
        	
            boolean accept = false;
            boolean deny = false;
            
            if(!election.isEmpty()) {
            	if(election.startsWith("+")) {
            		accept = true;
            		
            		election = election.substring(1);
            	} else if(election.startsWith("-")) {
            		deny = true;
            		
            		election = election.substring(1);
            	}
            }
            
            if(accept) {
            	client.sendButlerMessage(channel.getName(), "Nominierung akzeptieren");
            	return;
            }
            
            if(deny) {
            	client.sendButlerMessage(channel.getName(), "Nominierung ablehnen");
            	return;
            }
            
            if(election.isEmpty() || !election.isEmpty() && name.isEmpty()) {
            	StringBuilder sug = new StringBuilder();
        	
            	if(election.isEmpty()) {
            		for(String wahl : Server.elections.keySet()) {
            			String[] more = Server.elections.get(wahl);
            			int aktiv = Integer.parseInt(more[0]);
        		
            			if(aktiv == 1) {
            				String nominated = more[4];
            				sug.append("_").append(wahl).append("_#");
            		
            				for(String x : nominated.split("\\|")) {
            					if(!x.isEmpty()) {
            						String[] split = x.split("~");
            						String nick = split[0];
            						String nominiert = split[1];
            				
            						sug.append(nick).append(" (nom. von ").append(nominiert).append(")#");
            					}
            				}
            			}
            		} 
            	} else { 
            		if(!Server.elections.containsKey(election)) {
            			client.sendButlerMessage(channel.getName(), String.format("Die Wahl _%s gibt es nicht_.", election));
            			return;
            		}
            		
            		String[] more = Server.elections.get(election);
        			int aktiv = Integer.parseInt(more[0]);
    		
        			if(aktiv == 1) {
        				String nominated = more[4];
        				sug.append("_").append(election).append("_#");
        		
        				for(String x : nominated.split("\\|")) {
        					if(!x.isEmpty()) {
        						String[] split = x.split("~");
        						String nick = split[0];
        						String nominiert = split[1];
        				
        						sug.append(nick).append(" (nom. von ").append(nominiert).append(")#");
        					}
        				}
        			}
            	}
        	
            
            	if(sug.toString().isEmpty()) {
            		client.sendButlerMessage(channel.getName(), "Derzeit laufen keine Wahlen.");
            		return;
            	}
            
            	client.send(Popup.create("Wahlen", "Wahlen", sug.toString(), 400, 250));
            	return;
            }
            
            if(!name.isEmpty()) {
            	client.sendButlerMessage(channel.getName(), name+" nominieren");
            	return;
            }
        } else if(cmd.equals("vote")) {
        	if(!client.hasPermission("cmd.vote")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	arg = KCodeParser.escape(arg);
        	
        	if(arg.isEmpty()) {
        		int number = 1;
        		StringBuilder wahlen = new StringBuilder();
        		
        		for(String election : Server.elections.keySet()) {
        			int aktiv = Integer.parseInt(Server.elections.get(election)[0]);
        			
        			if(aktiv == 1) {
                		if(number != 1) {
                			wahlen.append(", ");
                		}
                		
                		wahlen.append(election);
                		number++;
        			}
        		}
                
                if(wahlen.toString().isEmpty()) {
            		client.sendButlerMessage(channel.getName(), "Derzeit laufen keine Wahlen.");
                	return;
                }
                
        		client.sendButlerMessage(channel.getName(), String.format("Folgende Wahlen laufen derzeit:#%s", wahlen.toString()));
        		return;
        	}

            List<String> nicks = new ArrayList<String>();
            
        	PoolConnection pcon = ConnectionPool.getConnection();
            Statement ps = null;

            try {
                Connection con = pcon.connect();
                ps = con.createStatement();
                ResultSet rs = ps.executeQuery(String.format("SELECT `name`, `aktiv`, `nominated` FROM `wahlen` WHERE `name` = '%s'", arg));
                
                if (!rs.next()) {
                    client.sendButlerMessage(channel.getName(), String.format("Es gibt im Moment keine %s-Wahlen.", arg));
                	return;
                }

                int aktiv = rs.getInt("aktiv");
                String nominated = rs.getString("nominated");
                
                if(aktiv == 0) {
                	client.sendButlerMessage(channel.getName(), String.format("Die %s-Wahl ist leider schon vorüber.", arg));
                	return;
                }

                for(String x : nominated.split("\\|")) {
                	if(!x.isEmpty()) {
                		String nick = x.split("~")[0].trim();
                		String stimmen = x.split("~")[1];
                		
                		nicks.add(String.format("%s~nom. von %s", nick, stimmen));
                	}
                }
                
                rs.close();
                rs = ps.executeQuery(String.format("SELECT `name` FROM `wahlenvoted` WHERE `name` = '%s' and `wahl` = '%s'", client.getName(), arg));
                if(rs.next()) {
                	client.sendButlerMessage(channel.getName(), "Sie haben bereits Ihre Stimme abgegeben.");
                	return;
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                if (ps != null) {
                    try {
                        ps.close();
                    } catch (SQLException e) {
                    }
                }

                pcon.close();
            }
        	
        	client.send(PacketCreator.votePopup(arg, nicks));
        	
        	if(arg.equals("admin")) {
        		client.send(Popup.create("Admin", "Admin", "Bei CuddlyChat werden die Admins aus den erfahrenen Channelmoderatoren (CM) gewählt.##_Wichtig:_#bitte fair bleiben und _nur mit Deinem Hauptnick_, mit dem Du eventuell auch selbst nominiert bist, _wählen_. Andernfalls werden _alle_ Deine Nicks gesperrt und Du erhältst eine Wahlsperre für die kommenden Chatwahlen!#Um einem nominierten Kandidaten Plus- oder Minusstimmen zu geben, gehe folgendermaßen vor##1. Gewünschten Nick im Textfeld unter'Kandidaten'eingeben.#2. Aus der unteren Liste passenden Nick auswählen.#3. Mit dem Plus-Button Positiv- und dem Minus-Button Negativstimmen vergeben.#4. Genauso mit allen weiteren Nicks verfahren.#5. Du kannst maximal fünf Positiv- und fünf Negativstimmen (maximal 2 pro Nick) vergeben.##Überlege Deine Entscheidung gut, und wähle vor allem die Chatter, die sich immer freundlich und hilfsbereit (vor allem den Neuen gegenüber) verhalten haben und die nötige Reife besitzen.", 400, 250));
        	}
        } else if(cmd.equals("desc")) {
        	if(!client.hasPermission("cmd.desc")) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
        	
            arg = KCodeParser.parse(client, arg, 0, 10, 20);
            
        	if(arg.isEmpty()) {
        		client.sendButlerMessage(channel.getName(), "Deine _Beschreibung_ wurde _entfernt_.");
        		client.setDesc(null);
        		return;
        	}
        	
        	if(arg.length() > 200) {
        		client.sendButlerMessage(channel.getName(), "Deine Beschreibung darf maximal 200 Zeichen betragen.");
        		return;
        	}
        	
        	arg = Server.get().parseSmileys(client, arg);
        			
        	client.sendButlerMessage(channel.getName(), String.format("_Beschreibung hinzugefügt_: %s#Du kannst sie mit _°BB>/fotowhois %s|\"<r°_ abrufen.", arg, client.getName().replace("<", "\\<")));
        	client.setDesc(arg);
        } else if(cmd.equals("fotowhois")) {
        	if(!client.hasPermission("cmd.fotowhois")) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
        	
        	arg = KCodeParser.escape(arg);
        	Client target = Server.get().getClient(arg.isEmpty() ? client.getName() : arg);
        	StringBuilder fw = new StringBuilder();
        	
        	if(target == null) {
        		target = new Client(null);
        		target.loadStats(arg);
        		
        		if(target.getName() == null) {
        			client.sendButlerMessage(channel.getName(), unknownUser(arg));
        			return;
        		}
        	}
        	
        	fw.append("°>CENTER<##°_°>_h").append(target.getName().replace("<", "\\<")).append(" (").append(target.getAge()).append(")    |/fotowhois ").append(target.getName().replace("<", "\\<")).append("|/w ").append(target.getName().replace("<", "\\<")).append("<>");
        	
        	if(target.getGender() == 1) {
        		fw.append("male...b.my_3");
        	} else {
        		fw.append("female...b.my_4");
        	}
        	
        	fw.append(".w_0.mx_-14.png<°_°##>");
        	
        	if(target.getPhoto().isEmpty()) {
        		fw.append("nopic_79x79_").append(target.getGender() == 1 ? "m":"f");
        	} else {
        		fw.append("photos/l/").append(target.getPhoto());
        	}
        	
        	fw.append("...border_3.jpg<>--<>|/foto ").append(target.getName().replace("<", "\\<")).append("|/w ").append(target.getName().replace("<", "\\<")).append("<°##");
        	
        	if(target.getDesc() == null) {
        		fw.append("keine Beschreibung");
        		
        		if(client == target) {
        			fw.append("##(Beschreibung mit /desc TEXT hinzufügen)");
        		}
        	} else {
        		fw.append("\"").append(target.getDesc()).append("\"");
        	}
        	
        	client.send(Popup.create(String.format("FotoWhois zu %s", target.getName()), null, fw.toString(), 400, 390));
        } else if(cmd.equals("kissen")) {
        	if (!client.checkCode(165) && !client.checkCode(166) && !client.hasPermission("cmd.kissen") && !client.hasPermission("cmd.kissen.global") && !client.hasPermission("cmd.kissen.channel")) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
        	arg = KCodeParser.escape(arg);
        	
        	if(arg.isEmpty()) {
        		return;
        	}
        	
        	if(arg.equals("+global")) {
        		if (!client.checkCode(166) && !client.hasPermission("cmd.kissen.global")) {
            		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            		return;
            	}
        		
            	client.sendButlerMessage(channel.getName(), "Eine °RR°_globale°r°_ Kissenschlacht wurde _gestartet_.");
        		
            	for(Channel c : Server.get().getChannels()) {
            		if(c.countClients() > 1) {
            			if(!c.getPfActive() && c.getGameName().isEmpty()) {
            				c.setPfActive(true);
            				c.setPfStarter(client.getName());
            			}
            		}
            	}
            	
            	return;
        	}

        	if(arg.equals("+channel")) {
        		if (!client.checkCode(165) && !client.hasPermission("cmd.kissen.channel")) {
            		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            		return;
            	}
        		
        		if(!channel.getGameName().isEmpty()) {
        			client.sendButlerMessage(channel.getName(), "In diesem Channel kann keine Kissenschlacht gestartet werden.");
        			return;
        		}
        		
        		if(channel.getPfActive()) {
                	client.sendButlerMessage(channel.getName(), "In diesem Channel findet momentan bereits eine Kissenschlacht statt.");
        			return;
        		}
        		
            	client.sendButlerMessage(channel.getName(), "Eine Kissenschlacht wurde _gestartet_.");
            	channel.setPfActive(true);
    			channel.setPfStarter(client.getName());
        		return;
        	}

        	if (!client.checkCode(165) && !client.checkCode(166) && !client.hasPermission("cmd.kissen") && !client.hasPermission("cmd.kissen.global") && !client.hasPermission("cmd.kissen.channel")) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
        	
        	if(arg.equals("+join")) {
        		if(!channel.getPfActive()) {
        			client.sendButlerMessage(channel.getName(), "In diesem Channel findet momentan keine Kissenschlacht statt.");
        		} else if(channel.getPfSpieler().contains(String.format("|%s|", client.getName()))) {
        			client.sendButlerMessage(channel.getName(), "Du bist bereits angemeldet.");
                                
                         } else if(client.getSpielsperre() != 0) {       
                                client.sendButlerMessage(channel.getName(), "Du bist momentan für alle Spiele gesperrt.");
                                                      
        		} else if(channel.getPfStatus() != 1) {
        			client.sendButlerMessage(channel.getName(), "Eine Anmeldung ist nicht mehr möglich.");
        		} else {
        			client.sendButlerMessage(channel.getName(), "Du hast dich erfolgreich angemeldet.");
        			
        			for(Client c : channel.getClients()) {
        				List<String> prefix = new ArrayList<String>();
        				prefix.add(String.format("%s~nf.gif~nf.gif~nf.gif", client.getName()));
        				c.send(PacketCreator.showPrefixIcons(channel.getName(), prefix));
        			}
        			
        			channel.setPfSpieler(String.format("%s|%s|", channel.getPfSpieler(), client.getName()));
        		}
        		
        		return;
        	}
        	
        	if(!channel.getPfActive()) {
    			client.sendButlerMessage(channel.getName(), "In diesem Channel findet momentan keine Kissenschlacht statt.");
    			return;
        	}
        	
        	if(client.getPfGeworfen() != 0 && (client.getPfGeworfen()+5)-time > 0 || channel.getPfStatus() != 3 || !channel.getPfSpieler().contains(String.format("|%s|", client.getName()))) {
    			client.sendButlerMessage(channel.getName(), "Du kannst momentan kein Kissen werfen.");
    			return;
        	}
        	
        	Client target = Server.get().getClient(arg);
        	
        	if(target == null) {
        		target = new Client(null);
        		target.loadStats(arg);
        		
        		if(target.getName() == null) {
        			client.sendButlerMessage(channel.getName(), unknownUser(arg));
        			return;
        		}
        	}
        	
        	if(target == client) {
        		client.sendButlerMessage(channel.getName(), "Du kannst dich nicht selbst abwerfen!");
        		return;
        	}
        	
        	if(!channel.getPfSpieler().contains(String.format("|%s|", target.getName()))) {
    			client.sendButlerMessage(channel.getName(), String.format("%s ist kein Mitspieler!", target.getName()));
    			return;
    		}
        	
        	target.setPfLeben((byte) (target.getPfLeben()-1));
        	channel.broadcastAction(client.getName(), String.format("hat %s mit einem großen Kissen mitten ins Gesicht getroffen! °>pf.gif<° %s", target.getName(), target.getPfLeben()==0?"_Ausgeschieden!":""));
        	client.sendButlerMessage(channel.getName(), String.format("Du hast _%s getroffen_! %s %s", target.getName(), target.getGenderLabel(), target.getPfLeben()==0?"ist _ausgeschieden_.":String.format("hat noch _%s Leben_.", target.getPfLeben())));
        	target.sendButlerMessage(channel.getName(), String.format("Du wurdest von _%s getroffen_! Du %s", client.getName(), target.getPfLeben()==0?"bist _ausgeschieden_.":String.format("hast noch _%s Leben_.", target.getPfLeben())));
        	client.setPfGeworfen(time);
        	
        	if(target.getPfLeben() == 2) {
    			for(Client c : channel.getClients()) {
    				List<String> prefix = new ArrayList<String>();
    				prefix.add(String.format("%s~nf.gif~nf.gif", target.getName()));
    				c.send(PacketCreator.showPrefixIcons(channel.getName(), prefix));
    			}
        	} else if(target.getPfLeben() == 1) {
    			for(Client c : channel.getClients()) {
    				List<String> prefix = new ArrayList<String>();
    				prefix.add(String.format("%s~nf.gif", target.getName()));
    				c.send(PacketCreator.showPrefixIcons(channel.getName(), prefix));
    			}
        	} else {
    			for(Client c : channel.getClients()) {
    				List<String> prefix = new ArrayList<String>();
    				prefix.add(String.format("%s~", target.getName()));
    				c.send(PacketCreator.showPrefixIcons(channel.getName(), prefix));
    			}
    			
        		channel.setPfSpieler(channel.getPfSpieler().replace(String.format("|%s|", target.getName()), ""));
        	}
        	
        	if(Server.countChars(channel.getPfSpieler(), '|') == 2) {
        		String l = channel.getPfSpieler().replace("|", "");
        		Client gewinner = Server.get().getClient(l);
        		
        		if(gewinner == null) {
        			gewinner = new Client(null);
        			gewinner.loadStats(l);
        		}
        		
        		channel.broadcastButlerMessage(String.format("Die Kissenschlacht ist _vorbei_! _Ein °>s/24.gif<°Knuddel_ hat der tapfere _Gewinner °BB>_h%s|/serverpp \"|/w \"<r° gewonnen_!", l.replace("<", "\\<")));
        		gewinner.increaseKnuddels(1);
        		channel.setPfActive(false);
    			channel.setPfSpieler("");
    			
    			for(Client c : channel.getClients()) {
    				c.send(PacketCreator.removePrefixIcons(channel.getName()));
    			}
    			
    			channel.setPfStatus(0);
        	}
        } else if(cmd.equals("sexy")) {
        	if (!client.checkCode(107) && !client.hasPermission("cmd.sexy")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            String nickname = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            String info = "Bitte die Funktion folgendermaßen benutzen:#/sexy NICK:TEXT";
            
            if (arg.length() > nickname.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            if(nickname.isEmpty() || msg.isEmpty()) {
            	client.sendButlerMessage(channel.getName(), info);
            	return;
            }
            
            if(client.getSexysperre() == 1) {
            	client.sendButlerMessage(channel.getName(), "Du kannst dieses Feature momentan nicht benutzen.");
            	return;
            }
            
        	Client lol = Server.get().getClient(nickname);
        	boolean online = true;
        	
        	if(lol == null) {
        		online = false;
        		lol = new Client(null);
        		lol.loadStats(nickname);
        		
        		if(lol.getName() == null) {
        			client.sendButlerMessage(channel.getName(), unknownUser(arg));
        			return;
        		}
        	}

        	if(!online) {
        		client.sendButlerMessage(channel.getName(), userIsOffline(lol));
				return;
			}
            
            if (!channel.getClients().contains(lol)) {
                client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° hält sich im Moment _in einem anderen Channel_ auf.", lol.getName()));
                return;
            }
        	
        	if(lol == client) {
        		client.sendButlerMessage(channel.getName(), "Du kannst dich selbst nicht sexy finden.");
				return;
        	}
        	
        	msg = KCodeParser.parse(client, msg, 5, 10, 20);
            msg = Server.get().parseSmileys(client, msg);
            
        	channel.broadcastAction(Server.get().getButler().getName(), String.format("findet °>_h%s|/serverpp \"|/w \"<° heute °RR°_extreeem sexy_%s°>pics/abo/sexy_whistle_001.mp<° und gibt die Nachricht mit: \"\"%s\"\".", lol.getName().replace("<", "\\<"), lol.getPhoto().isEmpty()?"°r°":String.format(" °BB>photos/m/%s...center_140.shadow_4.border_3.jpg<>--<>|%sphoto?n=%s<r°°>abo/sexy_photo-overlay...b.mx_-60.my_30.w_10.png<°", lol.getPhoto(), Server.get().getURL(), lol.getName().replace("<", "\\<")), msg));
        	icons = new ArrayList<Pair<String, Integer>>();
        	addIcon("pics/sexy.gif", 24, lol, null);
        	Server.sexy.add(lol.getName());
        	client.setSexysperre((byte)1);
        } else if (cmd.equals("dj")) {
        	if(!client.hasPermission("cmd.dj")) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
        	
        	if(arg.equals("stop")) {
        		client.sendButlerMessage(channel.getName(), "Der Song wurde angehalten.");
        		client.send(PacketCreator.playMp3(null));
        		return;
        	}
        } else if(cmd.equals("l")) {
        	if(!client.hasPermission("cmd.l")) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
        	
        	arg = KCodeParser.escape(arg);
        	
        	if(arg.isEmpty()) {
        		return;
        	}

        	client.sendButlerMessage(channel.getName(), "Der Song wird gestartet... Du kannst den Song jederzeit mit _°BB>/dj stop|\"<r°_ stoppen.");
        	client.send(PacketCreator.playMp3(null));
        	client.send(PacketCreator.playMp3(String.format("%s%s", Server.get().getURL(), arg)));
        } else if(cmd.equals("s")) { 
        	if(!client.hasPermission("cmd.s")) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
        	
        	arg = KCodeParser.escape(arg);
        	
        	if(arg.isEmpty()) {
        		client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/s TEXT#(TEXT bei Google suchen.)");
        		return;
        	}
        	
        	arg = arg.replace(" ", "+");
        	client.send(PacketCreator.openURL(String.format("http://www.google.de/#sclient=psy-ab&hl=de&q=%s", arg), "_blank"));
        } else if(cmd.equals("yt")) { 
        	if(!client.hasPermission("cmd.yt")) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
        	
        	arg = KCodeParser.escape(arg);
        	
        	if(arg.isEmpty()) {
        		client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/yt TEXT#(TEXT bei YouTube suchen.)");
        		return;
        	}
        	
        	arg = arg.replace(" ", "+");
        	client.send(PacketCreator.openURL(String.format("http://www.youtube.com/results?search_query=%s", arg), "_blank"));
        } else if (cmd.equals("a") || cmd.equals("postmsg")) {
        	if(!client.hasPermission(String.format("cmd.%s", cmd))) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
        	
            if(muted(client, channel)) { 
            	return;
            }
            
            if(moderated(client, channel)) {
            	client.sendButlerMessage(channel.getName(), "Aufgrund einer _moderierten Veranstaltung_ kannst du nicht öffentlich sprechen. Privates Flüstern ist natürlich erlaubt.");
            	return;
            }
            
            channel.broadcastMessage(arg, client, false);
        } else if(cmd.equals("admin")) {
            if(arg.isEmpty() || !client.hasPermission("cmd.admin.time") && !client.hasPermission("cmd.admin.activatemask") && !client.hasPermission("cmd.admin.deactivatemask")) {
        		client.send(PacketCreator.createAdmincallWindow("", "", ""));
            	return;
            }
            
            arg = arg.toLowerCase();
            
            if(arg.equals("mask")) {
            	if(!client.hasPermission("cmd.admin.activatemask")) {
            		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            		return;
            	}
            	
                client.sendButlerMessage(channel.getName(), "Tarnmodus _aktiviert_.");
                client.setMask((byte)1);
                return;
            }
            
            if(arg.equals("!mask")) {
            	if(!client.hasPermission("cmd.admin.deactivatemask")) {
            		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            		return;
            	}
            	
                client.sendButlerMessage(channel.getName(), "Tarnmodus _deaktiviert_.");
                client.setMask((byte)0);
                return;
            }
            
            if(arg.equals("?time")) {
            	if(!client.hasPermission("cmd.admin.time")) {
                	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                	return;
            	}
            	
                client.sendButlerMessage(channel.getName(), String.format("Du hast hier heute bereits %s Minuten verbracht.", nf.format(client.getAdminTime()/60)));
                return;
            }
        } else if (cmd.equals("afk") || cmd.equals("away")) {
        	if(!client.hasPermission(String.format("cmd.%s", cmd))) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
        	
            if(muted(client, channel)) { 
            	return;
            }
            
            if(moderated(client, channel)) {
            	client.sendButlerMessage(channel.getName(), "Aufgrund einer _moderierten Veranstaltung_ kannst du nicht öffentlich sprechen. Privates Flüstern ist natürlich erlaubt.");
            	return;
            }
            
        	StringBuilder away = new StringBuilder(afk[zufall.nextInt(afk.length)]);
            arg = KCodeParser.noKCode(arg);
            arg = Server.get().parseSmileys(client, arg);
        	
            if (!arg.isEmpty()) {
                away.append(" (").append(arg).append(")");
                client.setAwayReason(arg);
            }
            
            if(client.getRank() > 7) {
            	away.append(" °>icon_away_ani_new.gif<°");
            }

            channel.broadcastAction(client.getName(), away.toString());
            client.setAway(true);
        } else if(cmd.equals("mod")) { 
        	if(!client.hasPermission("cmd.mod.channel") && !client.hasPermission("cmd.mod.mod") && !client.hasPermission("cmd.mod.vip")) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
        	
            String nickname = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            
            if (arg.length() > nickname.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            if(nickname.isEmpty() || msg.isEmpty()) {
            	client.sendButlerMessage(channel.getName(), "Falscher Parameter.");
            	return;
            }
            
            String n = nickname.toLowerCase();
            String m = msg.toLowerCase();
            
            if(n.equals("channel")) {
            	if(!client.hasPermission("cmd.mod.channel")) {
                	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                	return;
            	}
            	
        		if(msg.toLowerCase().equals("on".toLowerCase())) {
        			client.sendButlerMessage(channel.getName(), "Channel wird nun _moderiert_. Du wurdest automatisch zum Moderator ernannt.");
        			
                	addIcon("pics/icon_moderator.png", 24, client,channel);
        			channel.setModerated(true);
        			channel.setMods(String.format("|%s|", client.getName()));
        			return;
        		}
        		
        		if(m.equals("off")) {
        			client.sendButlerMessage(channel.getName(), "Channel wird nicht mehr moderiert. MOD- und VIP-Rechte aller Mitglieder entzogen.");

        			for(String vip : channel.getVips().split("\\|")) {
        				if(!vip.isEmpty()) {
            				removeIcon("pics/icon_vip.png", vip,channel);
        				}
        			}
        			
        			for(String mod : channel.getMods().split("\\|")) {
        				if(!mod.isEmpty()) {
            				removeIcon("pics/icon_moderator.png", mod,channel);
        				}
        			}
        			
        			channel.setModerated(false);
        			channel.setMods("");
        			channel.setVips("");
        			return;
        		}
        		
    			client.sendButlerMessage(channel.getName(), "Falscher Parameter");
        		return;
        	}
            
            if(n.equals("vip") || n.equals("mod")) {
            	if(!client.hasPermission(String.format("cmd.%s", n))) {
                	
            	}
            	
            	if(!channel.isModerated()) {
            		client.sendButlerMessage(channel.getName(), "Der Channel ist _nicht moderiert_.");
            		return;
            	}
            	
            	msg = KCodeParser.escape(msg);
            	boolean entziehen = false;
            	
            	if(msg.startsWith("!")) {
            		msg = msg.substring(1);
            		entziehen = true;
            	}
            	
            	if(msg.isEmpty()) {
            		client.sendButlerMessage(channel.getName(), "Falscher Parameter.");
            		return;
            	}
            	
            	Client target = Server.get().getClient(msg);
            	boolean online = true;
            	
            	if(target == null) {
            		online = false;
            		target = new Client(null);
            		target.loadStats(msg);
            		
            		if(target.getName() == null) {
            			client.sendButlerMessage(channel.getName(), unknownUser(msg));
            			return;
            		}
            	}
            	
            	if(entziehen) {
                	if(!channel.checkVip(target.getName()) && n.equals("vip")) {
                		client.sendButlerMessage(channel.getName(), String.format("%s ist kein VIP!", target.getName()));
                		return;
                	}
                	
                	if(!channel.checkMod(target.getName()) && n.equals("mod")) {
                		client.sendButlerMessage(channel.getName(), String.format("%s ist kein Moderator!", target.getName()));
                		return;
                	}
                	
                	if(n.equals("vip")) {
                		client.sendButlerMessage(channel.getName(), String.format("Die VIP-Rechte von %s wurden entzogen.", target.getName()));
                    	removeIcon("pics/icon_vip.png", target.getName(),channel);
                    	if(online) {
                    		for(Channel x : target.getChannels()) {
                    			target.sendButlerMessage(x.getName(), String.format("Deine VIP-Rechte im Channel %s wurden soeben von %s entzogen.", channel.getName(), client.getName()));
                    		}
                    	}
                    	channel.setVips(channel.getVips().replace(String.format("|%s|", target.getName()), ""));
                	} else if(n.equals("mod")) {
                		client.sendButlerMessage(channel.getName(), String.format("Die MOD-Rechte von %s wurden entzogen.", target.getName()));
                		removeIcon("pics/icon_moderator.png", target.getName(),channel);
                		if(online) {
                			for(Channel x : target.getChannels()) {
                				target.sendButlerMessage(x.getName(), String.format("Deine MOD-Rechte im Channel %s wurden soeben von %s entzogen.", channel.getName(), client.getName()));
                			}
                		}
                		
                		channel.setMods(channel.getVips().replace(String.format("|%s|", target.getName()), ""));
                	}
                	
                	return;
            	}
            	
            	if(!online) {
            		client.sendButlerMessage(channel.getName(), userIsOffline(target));
            		return;
            	}
            	
            	if(channel.checkMod(target.getName())) {
            		client.sendButlerMessage(channel.getName(), String.format("%s ist bereits Moderator!", target.getName()));
            		return;
            	}
            	
            	if(channel.checkVip(target.getName())) {
            		client.sendButlerMessage(channel.getName(), String.format("%s ist bereits VIP!", target.getName()));
            		return;
            	}
            	
            	icons = new ArrayList<Pair<String, Integer>>();
            	if(n.equals("vip")) {
            		client.sendButlerMessage(channel.getName(), String.format("%s wurde als VIP gesetzt.", target.getName()));
            		addIcon("pics/icon_vip.png", 22, target,channel);
            		for(Channel x : target.getChannels()) {
            			target.sendButlerMessage(x.getName(), String.format("Du hast soeben VIP-Rechte von %s im Channel %s erhalten.", client.getName(), channel.getName()));
            		}
            		channel.setVips(String.format("%s|%s|", channel.getVips(), target.getName()));
            	} else if(n.equals("mod")) {
            		client.sendButlerMessage(channel.getName(), String.format("%s wurde als Moderator gesetzt.", target.getName()));
            		addIcon("pics/icon_moderator.png", 22, target,channel);
            		for(Channel x : target.getChannels()) {
            			target.sendButlerMessage(x.getName(), String.format("Du hast soeben MOD-Rechte von %s im Channel %s erhalten.", client.getName(), channel.getName()));
            		}
            		channel.setMods(String.format("%s|%s|", channel.getMods(), target.getName()));
            		
            	}
            	
            	return;
            }
            
            client.sendButlerMessage(channel.getName(), "Falscher Parameter.");
        } else if(cmd.equals("b")) {
        	if(!client.hasPermission("cmd.b.mute") && !client.hasPermission("cmd.b.say") && !client.hasPermission("cmd.b.do")) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
            
            String nickname = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            String info = "Bitte die Funktion folgendermaßen benutzen:#/b say/do:TEXT oder mute#(Lässt den Butler etwas schreiben/tun oder mutet/entmutet ihn.)";
            
            if (arg.length() > nickname.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            if(nickname.equals("mute")) {
            	if(!client.hasPermission("cmd.b.mute")) {
                	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                	return;
            	}
            	
                if(channel.butlerMuted()) {
                    channel.broadcastAction(Server.get().getButler().getName(), "hat seine Pause beendet und ist wieder voll einsatzbereit.");
                    channel.setButlerMuted(false);
                    return;
                }
                
                channel.broadcastAction(Server.get().getButler().getName(), "macht jetzt Pause.");
                channel.setButlerMuted(true);
                return;
            }
            
            if (nickname.isEmpty() || msg.isEmpty()) {
                client.sendButlerMessage(channel.getName(), info);
                return;
            }
            
            if(nickname.equals("say")) {
            	if(!client.hasPermission("cmd.b.say")) {
                	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                	return;
            	}
            	
            	if(msg.charAt(0) == '/') {
            		if(client.getRank() < 8) {
            			client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            			return;
            		}
            		
            		client.sendButlerMessage(channel.getName(), String.format("Funktion als _Butler ausgeführt_: %s", msg));
            		parse(msg, Server.get().getButler(), channel, false);
            		FunctionParser.parse(msg, Server.get().getButler(), channel);
            		return;
            	}
            	
                channel.broadcastButlerMessage(Server.get().parseSmileys(client, msg));
                return;
            }
                
            if(nickname.equals("do")) {
            	if(!client.hasPermission("cmd.b.do")) {
                	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                	return;
            	}
            	
            	if(msg.charAt(0) == '/') {
            		if(client.getRank() < 8) {
            			client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            			return;
            		}
            		
            		client.sendButlerMessage(channel.getName(), String.format("Funktion als _Butler ausgeführt_: %s", msg));
            		parse(msg, Server.get().getButler(), channel, false);
            		FunctionParser.parse(msg, Server.get().getButler(), channel);
            		return;
            	}
            	
                channel.broadcastAction(Server.get().getButler().getName(), Server.get().parseSmileys(client, msg.trim()));
                return;
            }  
            
            client.sendButlerMessage(channel.getName(), info);
        } else if (cmd.equals("career")) {
        	if(!client.hasPermission("cmd.career")) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
            
            String nickname = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            
            if (arg.length() > nickname.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            Client target = Server.get().getClient(nickname);
            boolean online = true;
            
            if (target == null) {
            	online = false;
                target = new Client(null);
                target.loadStats(nickname);

                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(nickname));
                    return;
                }
            }
            
            if(nickname.isEmpty() || msg.isEmpty()) {
                client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/career NICK:TEXT#(Fügt einen Career-Eintrag bei NICK hinzu.)"); 
                return;
            }
            
            if(msg.length() > 200) {
                client.sendButlerMessage(channel.getName(), "Der Text darf höchstens 200 Zeichen lang sein!"); 
                return;
            }
            
          /*  if(msg.toLowerCase().contains("verknuddelicht")) {
            	if(target.getStammiwhen().isEmpty()) {
            		client.sendButlerMessage(channel.getName(), String.format("%s muss mind. ein Monat Stammi sein damit du den Verknuddelichungseintrag tätigen kannst.", target.getName()));
            		return;
            	}
            }*/
            
            client.sendButlerMessage(channel.getName(), String.format("Der Career-Eintrag bei %s ist erfolgt.", target.getName()));
            
            if(online) {
            	target.setCareer(String.format("%s|%s %s|", target.getCareer(), Server.get().timeStampToDate(time), msg));
            	target.setProfile(String.format("%s|%s %s|", target.getProfile(), Server.get().timeStampToDate(time), msg));
            } else {
            	Server.get().query(String.format("update accounts set profile='%s|%s %s|', career='%s|%s %s|' where name='%s'", target.getProfile(), Server.get().timeStampToDate(time), msg, target.getCareer(), Server.get().timeStampToDate(time), msg, target.getName()));
            }
        }  else if(cmd.equals("cl")) {
        	if(!client.hasPermission("cmd.cl") && !channel.checkCm(client.getName()) && !channel.checkHz(client.getName())) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
        	
        	String nick = KCodeParser.escape(arg).split(":", 2)[0].trim();
        	String msg = "";

        	if(nick.isEmpty()) {
                if(channel.getCls().isEmpty()) {
                	client.sendButlerMessage(channel.getName(), "Momentan ist niemand in diesem Channel gesperrt.");
                } else {
                	client.sendButlerMessage(channel.getName(), String.format("Gesperrt sind:#%s", channel.getCls().replace("||", ", ").replace("|", "")));
                }
                
        		return;
        	}
        	
        	if (arg.length() > nick.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
        	
        	if (!nick.isEmpty() && arg.charAt(0) == '!') {
                nick = nick.substring(1).trim();
            }
        	
        	Client target = Server.get().getClient(nick);
        	boolean online = true;
        	
            if (target == null) {
            	online = false;
                target = new Client(null);
                target.loadStats(nick);

                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(nick));
                    return;
                }
            }
            
            if(arg.charAt(0) != '!' && !online) {
            	client.sendButlerMessage(channel.getName(), userIsOffline(target));
            	return;
            }
        	
            if(arg.charAt(0) == '!') {
				if(target.checkCl(channel)) {
            		client.sendButlerMessage(channel.getName(), String.format("%s wurde entsperrt.", target.getName()));
            		channel.setCls(channel.getCls().replace(String.format("|%s|", target.getName()), ""));
            	} else {
            		client.sendButlerMessage(channel.getName(), String.format("%s ist für diesen Channel nicht gesperrt.", target.getName())); //not the right text
            	}
            	
            	return;
            }
            
            if(!target.getChannels().contains(channel)) {
            	client.sendButlerMessage(channel.getName(), String.format("%s hält sich in einem _anderen Channel_ auf.", target.getName())); //not the right text
            	return;
            }
            
            if(target.getRank() > 4) {
            	client.sendButlerMessage(channel.getName(), String.format("Sie haben nicht genügend Rechte um %s in diesem Channel zu sperren.", target.getName()));
            	return;
            }
            
            if(msg.isEmpty()) {
            	client.sendButlerMessage(channel.getName(), String.format("Bitte geben Sie die Begründung für Ihre Sperre mit an: _/cl %s:GRUND", target.getName()));
            	return;
            }

            if(msg.length() < 10) {
            	client.sendButlerMessage(channel.getName(), "Ihre Begründung muss mindestens 10 Zeichen lang sein.");
            	return;
            }
           
            if(msg.length() > 350) {
            	client.sendButlerMessage(channel.getName(), "Ihre Begründung darf höchstens 350 Zeichen lang sein.");
            	return;
            }
            
            if(target.checkCl(channel)) {
            	client.sendButlerMessage(channel.getName(), String.format("%s ist bereits in diesem Channel gesperrt.", target.getName()));
            	return;
            }
            
            msg = KCodeParser.parse(client, msg, 5, 10, 20);
            msg = Server.get().parseSmileys(client, msg);
            String title = String.format("Gesperrt im %s", channel.getName());
            
            target.setComment(time, channel.getName(), "Channellock!", client.getName(), msg);
            target.setCls(target.getCls()+1);
            target.send(Popup.create(title, title, String.format("#Sie wurden von %s für den Channel %s _gesperrt_. Diese Sperre gilt bis morgen früh.##Begründung von %s:##%s", client.getName(), channel.getName(), client.getName(), msg), 400, 250));
            target.logout("Sie wurden rausgeworfen.");
            channel.broadcastAction(Server.get().getButler().getName(), String.format("war genervt und hat %s unsanft entfernt.", target.getName()));
            channel.setCls(String.format("%s|%s|", channel.getCls(), target.getName()));
        } else if(cmd.equals("cmc")) {
        	if(!client.hasPermission("cmd.cmc")) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
            
            String recipients = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            String info = "Bitte die Funktion folgendermaßen benutzen:#/cmc NICK:TEXT#(Fügt einen CM-Kommentar bei NICK hinzu.)";
            
            if (arg.length() > recipients.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            if (recipients.isEmpty()) {
                client.sendButlerMessage(channel.getName(), info); 
                return;
            }
            
            String nickname = recipients;
            Client target = Server.get().getClient(recipients);

            if (target == null) {
                target = new Client(null);
                target.loadStats(nickname);

                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(nickname));
                    return;
                }
            }
            
            if(msg.isEmpty()) {
                client.sendButlerMessage(channel.getName(), info); 
                return;
            }
            
            if(msg.length() > 200) {
                client.sendButlerMessage(channel.getName(), "Der CM-Kommentar darf höchstens 200 Zeichen lang sein!"); 
                return;
            }
            
            client.sendButlerMessage(channel.getName(), String.format("Der CM-Kommentar wurde bei %s eingetragen.", target.getName()));
            target.setComment(time, channel.getName(), null, client.getName(), msg);
        
        } else if (cmd.equals("comment")) {
        	if(!client.getTeams().contains("~1|")) {
        		if(client.getRank() < 3) {
                	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                	return;
            	}
        	}
            
            String nickname = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            String info = "Bitte die Funktion folgendermaßen benutzen:#/comment NICK:TEXT#(Fügt einen Adminkommentar bei NICK hinzu.)";
            
            if (arg.length() > nickname.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            if (nickname.isEmpty()) {
                client.sendButlerMessage(channel.getName(), info); 
                return;
            }
            
            Client target = Server.get().getClient(nickname);

            if (target == null) {
                target = new Client(null);
                target.loadStats(nickname);

                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(nickname));
                    return;
                }
            }
            
            if(msg.isEmpty()) {
                client.sendButlerMessage(channel.getName(), info); 
                return;
            }
            
            if(msg.length() > 200) {
                client.sendButlerMessage(channel.getName(), "Der Adminkommentar darf höchstens 200 Zeichen lang sein!"); 
                return;
            }
            
            client.sendButlerMessage(channel.getName(), String.format("Der Adminkommentar wurde bei %s eingetragen.", target.getName()));
            target.setComment(time, null, null, client.getName(), msg);
        } else if(cmd.equals("dice") || cmd.equals("d")) {
            if(!client.hasPermission(String.format("cmd.%s", cmd))) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
              
            String variablen = tools.DiceCreator.dice(arg,0);
            String[] teil = variablen.split("\\|");
        
            if (teil[5].equals("0")) {
                channel.broadcastAction("°BB°", String.format("> %s rollt %s Würfel%s...#%s: %s = _%s_",client.getName(),teil[0],teil[1],teil[2],teil[3],teil[4]));
                return;
            }
              
            client.sendButlerMessage(channel.getName(), String.format("%s", teil[2]));    
        } else if (cmd.equals("diceo")) {
        	if(!client.hasPermission("cmd.diceo")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            String variablen = tools.DiceCreator.dice(arg,1);
            String[] teil = variablen.split("\\|");
        
            if (teil[5].equals("0")) {
                channel.broadcastAction("°BB°", String.format("> %s rollt %s Würfel%s...#%s:%s = _%s_",client.getName(),teil[0],teil[1],teil[2],teil[3],teil[4]));
            } else {
                client.sendButlerMessage(channel.getName(), String.format("%s", teil[2]));
            }        
        } else if(cmd.equals("dream")) {
        	if (!client.checkCode(109) && !client.hasPermission("cmd.dream")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            arg = KCodeParser.escape(arg);
            Client target = Server.get().getClient(arg);
            
            if (arg.isEmpty()) {
                client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/dream NICK#(Von NICK träumen.)");
                return;
            }
            
            if(arg.equals("-")) {
                client.sendButlerMessage(channel.getName(), "Profileintrag gelöscht.");
                client.setDream(null);
                return;
            }
            
            if(client.getDreamsperre() == 1) {
            	client.sendButlerMessage(channel.getName(), "Du kannst dieses Feature momentan nicht benutzen.");
            	return;
            }
            
            if(target == null) {
                target = new Client(null);
                target.loadStats(arg);
                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(arg));
                    return;
                }
            }
            
            if(target.getName().equals(client.getName())) {
                client.sendButlerMessage(channel.getName(), "Du kannst nicht von dir selbst träumen!");
                return;
            }
            
            channel.broadcastAction("°BB°", String.format("> _°RR>_h%s|/serverpp \"|/w \"<BB>icon_dreamof...b.mx_-3.w_15.my_4.h_21.gif<°_ hat nur noch einen Traum: _°RR>_h%s|/serverpp \"|/w \"<BB°_. %s", client.getName().replace("<", "\\<"), target.getName().replace("<", "\\<"), target.getPhoto().isEmpty() ? "" : String.format("°>photos/m/%s...center_140.shadow_4.border_3.jpg<°", target.getPhoto())));
            client.setDream(target.getName());
            client.setDreamsperre((byte)1);
        } else if(cmd.equals("starlite")) {
        	if (!client.checkCode(108) && !client.hasPermission("cmd.starlite")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            arg = KCodeParser.escape(arg);
            
            if (arg.isEmpty()) {
                client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/starlite NICK#(NICK die Sterne vom Himmel holen.)");
                return;
            }
            
            if(arg.equals("!")) {
                client.sendButlerMessage(channel.getName(), "Profileintrag gelöscht.");
                
                if(client.getStarsTo() != null) {
                	Client c = Server.get().getClient(client.getStarsTo());
                
                	if(c != null) {
                		c.setStarsFrom(null);
                	} else {
                		Server.get().query(String.format("UPDATE accounts SET starsFrom=null where name='%s'", client.getStarsTo()));
                	}
                }

                client.setStarsTo(null);
                return;
            }
            
            if(client.getStarlitesperre() == 1) {
            	client.sendButlerMessage(channel.getName(), "Du kannst dieses Feature momentan nicht benutzen.");
            	return;
            }

            Client target  = Server.get().getClient(arg);
            boolean online = true;
            
            if(target == null) {
            	online = false;
                target = new Client(null);
                target.loadStats(arg);
                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(arg));
                    return;
                }
            }
            
            if(target == client) {
                client.sendButlerMessage(channel.getName(), "Du kannst dir nicht selbst die Sterne vom Himmel holen!");
                return;
            }
            
            if(client.getStarsTo() != null) {
            	Client c = Server.get().getClient(client.getStarsTo());
            
            	if(c != null) {
            		c.setStarsFrom(null);
            	} else {
            		Server.get().query(String.format("UPDATE accounts SET starsFrom=null where name='%s'", client.getStarsTo()));
            	}
            }
            
            channel.broadcastAction("°BB°", String.format("> _°RR>_h%s|/serverpp \"|/w \"<BB°_ holt für _°RR>_h%s|/serverpp \"|/w \"<BB°_ die Sterne vom Himmel! °>abo/icon_starlite_%s.gif<°", client.getName().replace("<", "\\<"), target.getName().replace("<", "\\<"), image(client, target)));
            
            if(online) {
            	target.sendButlerMessage(channel.getName(), "Um die erhaltenen Sterne wieder zurückzugeben, kannst du _/starlite !_ eingeben.");
                target.setStarsFrom(client.getName());
            } else {
            	Server.get().query(String.format("UPDATE accounts SET starsFrom='%s' where name='%s'", client.getName(), target.getName()));
            }
            
        	client.setStarsTo(target.getName());
        	client.setStarlitesperre((byte)1);
        } else if (cmd.equals("ds")) {
        	if(!client.hasPermission("cmd.ds")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
            
            arg = Server.get().parseSmileys(client, arg);
            
            if (!arg.isEmpty()) {
                for (Channel ch : Server.get().getChannels()) {
                    if(ch.countClients() > 1) {
                        ch.broadcastAction("°BB°", String.format("Durchsage von °>_h%s|/serverpp \"|/w \"<°: _°20°%s", client.getName().replace("<", "\\<"), arg));
                    }
                }
            }
        } else if (cmd.equals("update")) {
        	if(!client.hasPermission("cmd.update")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
            
            arg = Server.get().parseSmileys(client, arg);
            
            for (Channel ch : Server.get().getChannels()) {
                if(ch.countClients() > 1) {
                    ch.broadcastAction("°BB°", String.format("Durchsage von °>_h%s|/serverpp \"|/w \"<°: _°20°In 15 Sekunden gibt es aufgrund eines Updates einen Neustart des Chatservers. Nach ca. 30 Sekunden könnt ihr euch dann erneut einloggen.%s", client.getName(), arg.isEmpty()?"":String.format(" §°20°(%s)", arg)));
                }
            } 
            
            Server.get().newSysLogEntry(client.getName(), "Chatserver geupdated");
            
            Server.get().setUpdate(System.currentTimeMillis()/1000);

    	    try {
    	    	socket = new Socket("localhost", 1339);
    	    	in = new DataInputStream(socket.getInputStream());
    	    	out = new PrintStream(socket.getOutputStream());
    			out.println("UPDATE");
    			out.close();
    			in.close();
    			socket.close();
    	    } catch (Exception e) {
    	    	System.out.println("Updateserver ist aus!");
    	    }
        }else if (cmd.equals("edit") || cmd.equals("e")) {
        	if(arg.toLowerCase().equals("setlmc") && client.hasPermission("cmd.edit.setlmc")) {
        		client.sendButlerMessage(channel.getName(), String.format("Du kannst %s nicht als deinen Lieblings-MyChannel setzen.", channel.getName()));
        		return;
        	}
        	
        	if(!client.hasPermission("cmd.edit")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            String[] lala = arg.split(" ", 2);
            String a = lala[0].trim();
    		
            if (a.equals("description")) {
                String text = "";
                String b = lala[1].trim();

                if(b.equals("E-Mail verifizieren")) {
                	client.send(PacketCreator.createVerifyWindow(client.getName(), client.getEmail(), 1));
                	return;
                }
                
                if(b.equals("changever")) {
                	client.send(PacketCreator.createVerifyWindow(client.getName(), "", 1));
                	return;
                }
                
                if(b.equals("cancelver")) {
                	client.send(Popup.create("Verifizierung abgebrochen", "Verifizierung abgebrochen", String.format("Du hast die Verifizierung der E-Mail-Adresse %s erfolgreich abgebrochen.", client.getEmail()), 400, 250));
                	client.setEmailVerify((byte) 0);
                	return;
                }
                
                if(b.equals("Verifizierung läuft...")) {
                	Popup popup = new Popup("Laufende E-Mail-Verifizierung", "Laufende E-Mail-Verifizierung", String.format("Aktuell läuft die Verifizierung der E-Mail-Adresse %s für deinen Nick. Verwende die Buttons weiter unten, um die Verifizierung zu ändern oder abzubrechen.", client.getEmail()), 400,250);
                    Panel panel = new Panel();
                    panel.addComponent(new Button("   OK   "));
                    Button button1 = new Button("Verifizierung abbrechen");
                    button1.setCommand("/edit description cancelver");
                    Button button2 = new Button("Verifizierung ändern");
                    button2.setCommand("/edit description changever");
                    panel.addComponent(button1);
                    panel.addComponent(button2);
                    popup.addPanel(panel);
                    client.send(popup.toString());
                	return;
                }
                
                if (b.equals("Passwort")) {
                    text = "Um deine Änderungen zu speichern, _musst_ du unter Passwort dein bisheriges _Passwort_ angeben.";
                } else if (lala[1].contains("Neues Passwort")) {
                    text = "Wenn du dein Passwort ändern willst, gib unter _Neues Passwort_ und unter _Neues Passwort (2x)_ das gewünsche Passwort ein.";
                } else if (b.equals("E-Mail verifiziert?")) {
                    text = "Unter E-Mail verifiziert findest du heraus, ob deine aktuell eingetragene E-Mail-Adresse bereits verifiziert ist. Sollte das nicht der Fall sein, so erscheint ein Button E-Mail verifizieren, mit dessen Hilfe du die Verifizierung deiner eigenen E-Mail-Adresse einleiten kannst.##Über die verifizierte E-Mail-Adresse kannst du im Falle eines Passwortverlustes ein neues Passwort für den eigenen Nick beantragen.";
                }else if (b.equals("Geschlecht")) {
                    text = "Hier kannst du ein _Suchprofil_ angeben. Alle Mitglieder in einem Channel, die auf dein Suchprofil passen, werden in der Liste mit einem °>mentor_01.gif<° angezeigt.##Trag unter _Geschlecht_ das von dir dazu bevorzugte Geschlecht ein.";
                } else if (b.equals("Alter       von")) {
                    text = "Hier kannst du ein _Suchprofil_ angeben. Alle Mitglieder in einem Channel, die auf dein Suchprofil passen, werden in der Liste mit einem °>mentor_01.gif<° angezeigt.##Trag unter _Alter von - bis_ zwei Altersgrenzen ein, in deren Bereich du Bekanntschaften suchst.";
                } else if (b.equals("Motiv")) {
                    text = "Hier kannst du ein _Suchprofil_ angeben. Alle Mitglieder in einem Channel, die auf dein Suchprofil passen, werden in der Liste mit einem °>mentor_01.gif<° angezeigt.##Trag unter _Motiv_ ein, was du dir von einer Bekanntschaft versprichst.";
                } else if (b.equals("Entfernung bis")) {
                    text = "Hier kannst du ein _Suchprofil_ angeben. Alle Mitglieder in einem Channel, die auf dein Suchprofil passen, werden in der Liste mit einem °>mentor_01.gif<° angezeigt.##Trag unter _Entfernung bis_ ein, wie weit eine neue Bekanntschaft höchstens von dir entfernt wohnen soll. Diese Einstellung wird nur dann aktiv, wenn du selbst eine _gültige Postleitzahl_ angegeben hast.";
                } else if (b.equals("Alter")) {
                    text = "Gib hier dein _Alter_ an. Sofern du ein Geburtsdatum angibst, wird diese Angabe ignoriert und dein Alter anhand des Geburtsdatums bestimmt.##Wenn du dein Alter angibst, dann sollte der Eintrag immer deinem wirklichen Alter entsprechen, der Eintrag kann später über natürliche Alterung hinaus nicht mehr korrigiert werden.";
                } else if (b.equals("Dein Geschlecht")) {
                    text = "Trag unter _Geschlecht_ ein, ob du weiblich oder männlich bist.";
                } else if (b.equals("Vergeben")) {
                    text = "Unter _Vergeben_ kannst du z.B. angeben, ob du Single, verliebt, vergeben oder sogar verheiratet bist. Diese Information ist meistens _sehr interessant_ für die anderen Mitglieder.";
                } else if (b.equals("Stadt")) {
                    text = "Trag unter _Stadt_ ein, in welcher Stadt bzw. in welchem Ort du wohnst.";
                } else if (b.equals("Land")) {
                    text = "Trag unter _Land_ ein, in welchem Land du lebst.";
                } else if (b.equals("Hobbys")) {
                    text = "Deine wichtigsten Hobbys solltest du unter _Hobbys_ angeben.";
                } else if (b.equals("Motto")) {
                    text = "Unter _Motto_ kannst du noch einen persönlichen Text setzen, der nicht in die anderen Feldern passte.";
                } else if (b.equals("Realname")) {
                    text = "Wenn du möchtest, kannst du unter _Realname_ deinen echten Vornamen angeben.";
                } else if (b.equals("Geburtstag")) {
                    text = "Hier solltest du deinen _Geburtstag_ angeben.#Wenn dein Geburtstag angegeben ist, hat das folgende Auswirkungen:#- Dein Alter wird automatisch bestimmt#- Du kannst dein Sternzeichen anzeigen lassen (unter Privatsphäre)##Falls du nicht möchtest, dass dein Geburtsdatum angezeigt wird, kannst du die Anzeige unter Privatsphäre ausstellen.#Sobald dein Alter verifiziert ist, kann es nicht mehr geändert werden.";
                } else if (lala[1].contains("Postleitzahl")) {
                    text = "Trag dein _Land_ und deine _Postleitzahl_ ein.#Deine Postleitzahl ist für _niemanden_ einsehbar. Wenn du eine Postleitzahl angegeben hast, dann kannst du sehen (mit der /w Funktion oder Rechtsklick), wie weit andere Mitglieder, die auch eine Postleitzahl angegeben haben, von dir entfernt wohnen (in Kilometern).##Es ist nicht notwendig, dass du deine ganze Postleitzahl angibst - _es reichen die ersten drei Ziffern._";
                } else if (b.equals("Job")) {
                    text = "Unter _Job_ kannst du eintragen, was du arbeitest.";
                } else if (b.equals("Email")) {
                    text = "Trage hier deine E-Mail Adresse ein, um zu einen späteren Moment das Passwort an diese E-Mail Adresse schicken zu lassen.";
                } else if (b.contains("Spitznamen")) {
                    text = "Trag hier mit Komma getrennt alle Namen ein, unter denen du im Chat angesprochen werden willst.##Das Chatfenster wird diese Namen in allen Chattexten _fett hervorheben_.";
                } else if (b.equals("Lieblingschannel")) {
                    text = "Hier kannst du deinen _Lieblingschannel_ angeben.#Dein Lieblingschannel wird zum einen in _deiner Info_ (/w) angezeigt.#Der größte Vorteil ist allerdings, dass du deinen Lieblingschannel auch immer noch dann betreten kannst, wenn er _eigentlich überfüllt_ ist.##_Beachte_:#Deinen Lieblingschannel kannst du nur einmal im Monat ändern.";
                } else if (b.equals("Eigener Channel")) {
                    text = "Klick auf 'Editieren', um deinen eigenen Channel einzurichten und die Einstellungen daran zu ändern.";
                } else if (b.equals("?")) {
                    text = "In diesem Fenster kannst du die Daten und Einstellungen zu deinem Nick verändern. Nach deiner Änderung musst du auf _Speichern_ klicken, um die Daten abzuspeichern.##Um _weitere Hilfe_ zu den einzelnen Feldern zu erhalten, klick einfach auf den _Text links neben einem Eingabefeld_.";
                } else if (b.contains("verifizieren")) {
                    CommandParser.parse("/verify", client,client.getChannel(), false);
                }
                	
                client.send(Popup.create("Info", "Info", text, 400, 250));
            } else if(a.equals("verify")) {
                client.send(Popup.create("Info", "Info", "Unter E-Mail verifiziert findest du heraus, ob deine aktuell eingetragene E-Mail-Adresse bereits verifiziert ist. Sollte das nicht der Fall sein, so erscheint ein Button E-Mail verifizieren, mit dessen Hilfe du die Verifizierung deiner eigenen E-Mail-Adresse einleiten kannst.##Über die verifizierte E-Mail-Adresse kannst du im Falle eines Passwortverlustes ein neues Passwort für den eigenen Nick beantragen.", 400, 250));
            } else {
            	arg = KCodeParser.escape(arg);
            	Client target = arg.isEmpty() || client.getRank() < 11 ? client:Server.get().getClient(arg);
            	
            	if(target == null) {
            		target = new Client(null);
            		target.loadStats(arg);
            		
            		if(target.getName() == null) {
            			client.sendButlerMessage(channel.getName(), unknownUser(arg));
            			return;
            		}
            	}
            	
            	client.send(tools.PacketCreator.createEditWindow(target)); 
            }
        } else if (cmd.equals("todo")) {
        	if(!client.hasPermission("cmd.todo")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	if(arg.isEmpty()) {
            	StringBuilder todo = new StringBuilder();
            	
        		for(String text : Server.todo.keySet()) {
        			String von = Server.todo.get(text);
        			
        			todo.append("#°>gt.gif<° ").append(text).append("#   °RR°_-->>_°r° ").append(von).append("#");
        		}
        	
        		String title = "ToDo List";
        		client.send(Popup.create(title, title, todo.toString(), 400, 250));
        		return;
        	}
        	
        	arg = arg.replace("'", "\\'");
        	
        	client.sendButlerMessage(channel.getName(), "Der Eintrag wurde der ToDo List hinzugefügt.");
        	Server.todo.put(arg, client.getName());
        	Server.get().query(String.format("insert into todo set text='%s',von='%s'", arg, client.getName()));
        } else if(cmd.equals("flame")) {
        	if(!client.hasPermission("cmd.flame")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
            
            String recipients = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            String info = "Bitte die Funktion folgendermaßen benutzen:#/flame NICK:TEXT#(Schickt NICK eine Androhung rechtlicher Konsequenzen. TEXT wird als Kommentar in der Admininfo von NICK hinterlassen.)";
            
            if (arg.length() > recipients.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            if (recipients.isEmpty()) {
                client.sendButlerMessage(channel.getName(), info); 
                return;
            }
            
            String nickname = recipients;
            Client target = Server.get().getClient(recipients);
            boolean online = true;
            
            if (target == null) {
            	online = false;
                target = new Client(null);
                target.loadStats(nickname);

                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(nickname));
                    return;
                }
            }
            
            if(!online) {
            	client.sendButlerMessage(channel.getName(), userIsOffline(target));
            	return;
            }
            
            if(msg.isEmpty()) {
                client.sendButlerMessage(channel.getName(), info); 
                return;
            }
            
            if(target == client || target.getRank() >= client.getRank()) {
                client.sendButlerMessage(channel.getName(), String.format("Du kannst %s keine Androhung schicken!", target.getName())); 
                return;
            }
            
            if(msg.length() > 350) {
                client.sendButlerMessage(channel.getName(), "Der Kommentar darf höchstens 350 Zeichen lang sein!"); 
                return;
            }
            

            client.sendButlerMessage(channel.getName(), String.format("Die Androhung wurde an %s gesendet.", target.getName()));
            String text = String.format("#°R°_Ihre IP-Adresse ist %s.#Ich werde morgen früh eine Abusemail mit den Logfiles und Androhung rechtlicher Konsequenten an Ihren Provider schicken, wenn Sie nicht augenblicklich Ihre Störungen dieses Chats einstellen!##Letzte WARNUNG!", target.getIPAddress());
        	target.setComment(time, null, "Flame!", client.getName(), msg);
        	Server.get().newMessage(Server.get().getButler(), target.getName(), "Abmahnung Ihres Missbrauchs", text, time);
        	
            parse("/h knigge", target, target.getChannel(), false);
            parse("/h agb", target, target.getChannel(), false);
            String title = ">>> ACHTUNG <<<";
            target.send(Popup.create(title, title, text, 400, 250));
            target.setFlames(target.getFlames()+1);
        } else if(cmd.equals("kick") || cmd.equals("k")) {
        	if(!client.hasPermission("cmd.kick")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
            
            String recipients = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            String info = "Bitte die Funktion folgendermaßen benutzen:#/kick NICK:TEXT#(Wirft NICK aus allen Channels. TEXT wird als Kommentar in der Admininfo vermerkt. Zusätzlich wird die IP von NICK bei der Registrierung und im Chat gesperrt.)";
            
            if (arg.length() > recipients.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            if (recipients.isEmpty()) {
                client.sendButlerMessage(channel.getName(), info); 
                return;
            }
            
            String nickname = recipients;
            Client target = Server.get().getClient(recipients);
            boolean online = true;
            
            if (target == null) {
            	online = false;
                target = new Client(null);
                target.loadStats(nickname);

                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(nickname));
                    return;
                }
            }
            
            if(!online) {
            	client.sendButlerMessage(channel.getName(), userIsOffline(target));
            	return;
            }
            
            if(msg.isEmpty()) {
                client.sendButlerMessage(channel.getName(), info); 
                return;
            }
            
            if(target == client || target.getRank() >= 4) {
                client.sendButlerMessage(channel.getName(), String.format("%s kann nicht gekickt werden.", target.getName())); 
                return;
            }
            
            if(msg.length() > 350) {
                client.sendButlerMessage(channel.getName(), "Der Kommentar darf höchstens 350 Zeichen lang sein!"); 
                return;
            }
            

            client.sendButlerMessage(channel.getName(), String.format("%s wurde aus allen Channels geworfen.", target.getName()));
            
            parse("/h knigge", target, target.getChannel(), false);
            parse("/h agb", target, target.getChannel(), false);
            target.send(PacketCreator.openURL(String.format("%sagb", Server.get().getURL()), "_blank"));
            target.setKicks(target.getKicks()+1);
            target.logout("Sie wurden rausgeworfen.");
            target.setComment(time, null, "Kick!", client.getName(), msg);
        	Settings.setBan(String.format("%s|%s|", Settings.getBan(), target.getIPAddress()));
            Server.get().query(String.format("insert into register set ip='%s'", target.getIPAddress()));
        } else if (cmd.equals("foto")) {
        	if(!client.hasPermission("cmd.foto")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            arg = KCodeParser.escape(arg);

            if (arg.isEmpty()) {
                client.send(PacketCreator.openURL(String.format("%sphotos-settings", Server.get().getURL()), "_blank"));
                return;
            }
            
            Client target = Server.get().getClient(arg);

            if (target == null) {
                target = new Client(null);
                target.loadStats(arg);

                if (target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(arg));
                    return;
                }         
            } 
            
            if (target.getPhoto().isEmpty()) {
                client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° hat derzeit kein Foto eingestellt.", target.getName().replace("<", "\\<")));
                return;
            }
        
            client.send(PacketCreator.openURL(String.format("%sphotos-profile?id=%s", Server.get().getURL(), target.getName()), "_blank"));    
        } else if(cmd.equals("foreverfriends")) {
        	if(!client.hasPermission("cmd.foreverfriends")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            arg = KCodeParser.escape(arg);
            Client target;
            target = Server.get().getClient(arg);
            
            if (arg.isEmpty()) {
                client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/foreverfriends NICK#(Ewige Freundschaft mit NICK schließen.)");
                return;
            }
            
            if(arg.equals("-")) {
                client.sendButlerMessage(channel.getName(), "Profileintrag gelöscht.");
                client.setFriends(null);
                return;
            }
            
            if(client.getFriendssperre() == 1) {
            	client.sendButlerMessage(channel.getName(), "Du kannst dieses Feature momentan nicht benutzen.");
            	return;
            }
            	
            if(target == null) {
                target = new Client(null);
                target.loadStats(arg);
                
                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(arg));
                    return;
                }
            }
            
            if(target.getName().equals(client.getName())) {
                client.sendButlerMessage(channel.getName(), "Du willst ewige Freundschaft mit dir selbst schließen?!");
                return;
            }
            
            channel.broadcastAction("°BB°", String.format("> _°RR>_h%s|/serverpp \"|/w \"<BB°_ und _°RR>_h%s|/serverpp \"|/w \"<BB°_ schließen ewige Freundschaft. °>icon_friendsforever...b.my_6.mx_-4.w_29.h_14.gif<°", client.getName().replace("<", "\\<"), target.getName().replace("<", "\\<")));
            client.setFriendssperre((byte)1);
            client.setFriends(target.getName());
        } else if (cmd.equals("forum")) {
        	if(!client.hasPermission("cmd.forum")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	client.send(PacketCreator.openURL(String.format("%sforum/", Server.get().getURL()), "_blank"));
        } else if (cmd.equals("h") || cmd.equals("?") || cmd.equals("help") || cmd.equals("hilfe")) {
        	if(!client.hasPermission("cmd.help")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	arg = KCodeParser.escape(arg);
        
            if(arg.isEmpty() || arg.equals("help")) {
                StringBuilder h = new StringBuilder();
                int dD = 0;
                StringBuilder anicks = new StringBuilder();
                h.append("Du bist _").append(client.getRankLabel(client.getRank())).append("_ und hast folgende Rechte:##");
                
                for(String function : Server.functions.keySet()) {
                	String[] split = Server.functions.get(function);
                	byte rank = Byte.parseByte(split[0]);
                	String text = split[1];
                	
                	if(client.getRank() >= rank) {	
                		h.append("_/").append(function).append("_#(").append(text).append(")##");
                	}
                }
                
                PoolConnection pcon = ConnectionPool.getConnection();
                Statement ps = null;
                
                try {
                    Connection con = pcon.connect();
                    ps = con.createStatement();
                    ResultSet rs = ps.executeQuery(String.format("SELECT name FROM `accounts` where `rank` =6 and `name` != '%s'", Server.get().getButler().getName()));
                    
                    while(rs.next()) {
                        anicks.append(dD!=0?", ":"").append("°>_h").append(rs.getString("name")).append("|/serverpp \"|/w \"<°");
                        dD++;
                    }
            
                    h.append("Admins sind derzeit:#").append(anicks.toString());
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    if (ps != null) {
                        try {
                            ps.close();
                        } catch (SQLException e) {
                        }
                    }

                    pcon.close();
                }
                
                h.append("##(insgesamt ").append(dD).append(" Admins)");
                
                client.send(Popup.create("Hilfe", "Hilfe", h.toString(), 450, 300));
                return;
            }
            
            String argt = arg.toLowerCase();

            if(!Server.help.containsKey(argt)) {
            	client.sendButlerMessage(channel.getName(), String.format(help[zufall.nextInt(help.length)], arg));
                return;
            }
            
            String[] split = Server.help.get(argt);
            String title = split[0];
            String text = split[1];
            
            if(arg.toLowerCase().contains("-team".toLowerCase())) {
            	String team = arg.replace("-team", "").toLowerCase();

            	if(Settings.getTeams().toLowerCase().contains(String.format("|%s|", team))) {
            		StringBuilder tl = new StringBuilder();
            		StringBuilder tm = new StringBuilder();
            		int num1 = 1, num2 = 1;
            		
            		PoolConnection pcon1 = ConnectionPool.getConnection();
                    PreparedStatement ps1 = null;
                    
                    try {
                        Connection con1 = pcon1.connect();
                        ps1 = con1.prepareStatement("SELECT `name`, `teams` FROM `accounts` WHERE `teams` != ''");
                        ResultSet rs1 = ps1.executeQuery();
                        
                        while(rs1.next()) {
                        	String name = rs1.getString("name");
                        	String tea = rs1.getString("teams");
                        	
                        	if(tea.toLowerCase().contains(String.format("|%s~0|", team))) {
                        		if(num1 != 1) {
                            		tm.append(", ");
                            	}

                            	tm.append("°>_h");
                        		tm.append(name.replace("<", "\\<"));
                        		tm.append("|/serverpp \"|/w \"<°");
                        		num1++;
                        	} else if(tea.toLowerCase().contains(String.format("|%s~1|", team))) {
                            	if(num2 != 1) {
                            		tl.append(", ");
                            	}
                            	
                            	tl.append("°>_h");
                        		tl.append(name.replace("<", "\\<"));
                        		tl.append("|/serverpp \"|/w \"<°");
                        		num2++;
                            }
                        }
                    } catch (SQLException e) {
                        e.printStackTrace();
                    } finally {
                        if (ps1 != null) {
                            try {
                                ps1.close();
                            } catch (SQLException e) {
                            }
                        }

                        pcon1.close();
                    }

                    String tlstring = tl.toString();
                    String tmstring = tm.toString();

                    text = text.replace("[TL]", tlstring.isEmpty()?"Keine":tlstring);
                    text = text.replace("[TM]", tmstring.isEmpty()?"Keine":tmstring);
            	}
            }
            
            client.send(Popup.createClose(title, title, text, 450, 310));
        } else if(cmd.equals("heart")) {
        	if(!client.checkCode(70) && !client.checkCode(55) && !client.hasPermission("feature.trashheart")) {
        		if(client.getRank() < 1) {
                	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                	return;
            	}
            }
            
            String re = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            
            if (arg.length() > re.length()) {
                msg = arg.substring(arg.indexOf(':', 2) + 1).trim();
            }
            
            String herz = client.getHeart();
            int herzsperre = client.getHeartsperre();
            
            if (arg.isEmpty()) {  
        		if(client.getRank() < 1) {
                	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                	return;
            	}
        		
                if(herzsperre == 1 && herz.isEmpty()) {
                    client.sendButlerMessage(channel.getName(), "Obwohl du dein Herz im Moment nicht vergeben hast, kannst du es erst im nächsten Monat wieder vergeben.");
                    return;
                }
                
                if(herzsperre == 0 && herz.isEmpty()) {
                    client.sendButlerMessage(channel.getName(), "Du hast dein Herz derzeit nicht vergeben.");
                    return;
                }
                    
                client.sendButlerMessage(channel.getName(), String.format("Du hast dein Herz derzeit an °>_h%s|/serverpp \"|/w \"<° vergeben%s.", herz.replace("<", "\\<"), (herzsperre == 1 ? " und kannst es erst im kommenden Monat an eine andere Person vergeben" : "")));
                return;
            }
            
            if (arg.equals("!")) {
        		if(client.getRank() < 1) {
                	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                	return;
            	}
        		
                if(herz.isEmpty()) {
                    client.sendButlerMessage(channel.getName(), "Du hast dein Herz derzeit an niemanden vergeben.");
                }else{
                    client.sendButlerMessage(channel.getName(), String.format("Du hast dein Herz an °>_h%s|/serverpp \"|/w \"<° wieder entzogen.", herz.replace("<", "\\<")));
                    Server.get().newMessage(Server.get().getButler(), herz, "Herz entzogen", String.format("%s hat dir das Herz wieder entzogen.", client.getName()), time);
                    client.setHeart("");
                }
                
                return;
            }
            boolean giveBack = false;
            if(re.startsWith("-")) {
            	re = re.substring(1);
            	giveBack = true;
            }
            boolean herzbotschaft = false;
            if(re.startsWith("+")) {
            	re = re.substring(1);
            	herzbotschaft = true;
            }
            
            Client target = Server.get().getClient(re);
            boolean online = true;

            if (target == null) {
                online = false;
                target = new Client(null);
                target.loadStats(re);

                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(re));
                    return;
                }
            }
            
            msg = KCodeParser.parse(client, msg, 5, 10, 20);
            msg = Server.get().parseSmileys(client, msg);
            
            if(giveBack) {
            	if(!client.hasPermission("feature.trashheart")) {
            		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung");
            		return;
            	}
            	
            	if(!target.getHeart().equals(client.getName())) {
            		client.sendButlerMessage(channel.getName(), String.format("Du hast kein Herz von %s erhalten.", target.getName()));
            		return;
            	}
            	
            	client.sendButlerMessage(channel.getName(), String.format("Du hast dein Herz %s zurückgegeben.", target.getName()));
            	Server.get().newMessage(Server.get().getButler(), target.getName(), "Herz zurückgegeben", String.format("%s hat dir dein Herz zurückgegeben.", client.getName()), time);
            	if(online) {
            		target.setHeart("");
            		target.receivedHearts.remove(client.getName());
            	} else {
            		Server.get().query(String.format("update accounts set heart='' where name='%s'", target.getName()));
            	}
            	return;
            }
            
            if(!online) {
                client.sendButlerMessage(channel.getName(), userIsOffline(target));
                return;
            }
            
            if(herzbotschaft) {
            	if(!client.checkCode(55)) {
            		if(client.getRank() < 8) {
            			client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung");
            			return;
            		}
            	}

                if(target == client) {
                    client.sendButlerMessage(channel.getName(), "Du kannst dir selbst keine Herzbotschaft schicken.");
                    return;
                }

                if(client.getHeartMessage() == 1) {
                	client.sendButlerMessage(channel.getName(), "Du kannst dieses Feature momentan nicht benutzen.");
                	return;
                }
                
            	client.sendButlerMessage(channel.getName(), String.format("Du hast _°BB>_h%s|/serverpp \"|/w \"<r°_ jetzt folgende °>fullheart.png<°-Botschaft gesendet...°>|{backgroundad|heartAd_bright.jpg|heartAd_bright.jpg|heartAd_dark.jpg|heartAd_dark.jpg|0|0|0|0|5|20|http://www.knuddels.de| %s|255,255,255|255,255,255|28|0|-22<°", target.getName().replace("<", "\\<"), msg));
            	
            	for(Channel s : target.getChannels()) {
                	target.sendButlerMessage(s.getName(), String.format("_°BB>_h%s|/serverpp \"|/w \"<r°_ sendet dir diese °>fullheart.png<°-Botschaft...°>|{backgroundad|heartAd_bright.jpg|heartAd_bright.jpg|heartAd_dark.jpg|heartAd_dark.jpg|0|0|0|0|5|20|http://www.knuddels.de| %s|255,255,255|255,255,255|28|0|-22<°", client.getName().replace("<", "\\<"), msg));
            	}
            	
            	client.setHeartMessage((byte)1);
            	return;
            }
            
    		if(client.getRank() < 1) {
            	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            	return;
        	}
            
            if(target == client) {
                client.sendButlerMessage(channel.getName(), "Du kannst dein eigenes Herz nicht an dich selbst vergeben, Eigenliebe ist nicht angesagt.");
                return;
            }
            
            if(target == Server.get().getButler()) {
                client.sendButlerMessage(channel.getName(), String.format("Du kannst dein Herz nicht an %s geben.", Server.get().getButler().getName()));
                return;
            }

            
            if (!channel.getClients().contains(target)) {
                client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° hält sich im Moment _in einem anderen Channel_ auf.", target.getName()));
                return;
            }
            
            if(herz.equals(target.getName())) {
                client.sendButlerMessage(channel.getName(), String.format("Du hast dein Herz bereits an %s vergeben.", herz));
                return; 
            }
            
            if(herzsperre == 1) {
                client.sendButlerMessage(channel.getName(), String.format("Du kannst dein Herz nur einmal im Monat vergeben. %s", herz.isEmpty()?"":String.format("Mit _/heart !_ kannst du dein Herz %s wieder entziehen.", herz)));
                return;
            }
            
            channel.broadcastPicAction(">>>", String.format("%s nimmt all seinen Mut zusammen und schenkt %s das eigene °>fullheart.png<°%s", client.getName(), target.getName(), msg.isEmpty() ? "." : String.format(" mit folgendem Text:#%s", msg)), String.format("actHeart_%s.png", image(client, target))); 
            
            for(Channel p : target.getChannels()) {
            	target.sendButlerMessage(p.getName(), String.format("_%s_ hat dir soeben das °>fullheart.png<° geschenkt. Wenn du das Herz von %s nicht haben möchtest, kannst du es in den nächsten Minuten mit _°BB>/deny|\"<r°_ zurückgeben.", client.getName(), client.getName()));
            }
            
            if(!herz.isEmpty()) {
            	Server.get().newMessage(Server.get().getButler(), herz, "Herz entzogen", String.format("%s hat dir das Herz wieder entzogen.", client.getName()), time);
            }
            
            client.setHeart(target.getName());
            target.setDeny(client.getName());
            
            if(client.getRank() < 8) {
            	client.setHeartsperre((byte)1);
            }
        } else if (cmd.equals("his")) {
        	if(!client.hasPermission("cmd.his") && !channel.checkCm(client.getName()) && !channel.checkHz(client.getName())) {
                client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                return;
        	}
        	
        	String nickname = KCodeParser.escape(arg).split(":", 2)[0].toLowerCase();
        	
            String msg = "";
             
            if (arg.length() > nickname.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            Channel target = arg.isEmpty() || nickname.equals("-")?channel:Server.get().getChannel(nickname);

            if(target == null) {
            	client.sendButlerMessage(channel.getName(), String.format("Der Channel _%s existiert nicht_.", nickname));
            	return;
            }
            
            if(!msg.isEmpty()) {
            	Client nick = Server.get().getClient(msg);
            	
            	if(nick == null) {
            		nick = new Client(null);
            		nick.loadStats(msg);
            		
            		if(nick.getName() == null) {
            			client.sendButlerMessage(channel.getName(), unknownUser(msg));
            			return;
            		}
            	}
            }
            
            StringBuilder his = new StringBuilder();
            int anzahl = target.history.size();
            
            if(anzahl == 0) {
            	client.sendButlerMessage(channel.getName(), String.format("Für den Channel %s sind keine öffentlichen Nachrichten mehr gespeichert.", target.getName()));
                return;
            }
            
            
            
            List<Long> sortedList = new ArrayList<Long>();
            sortedList.addAll(channel.history.keySet());
            Collections.sort(sortedList);
            Iterator<Long> iter = sortedList.iterator();

            while (iter.hasNext()) {
            	Long key = iter.next();
            	String[] split = target.history.get(key);
            	String name = split[0].replace("<", "\\<");
            	String text = split[1];
         	 	String uhrzeit = Server.get().timeStampToTime(key);

                his.append("##_");
                
                if(name.toLowerCase().equals(msg.toLowerCase())) {
                	his.append("°R°-->>°r° ");
                }
                
                his.append(name).append(":_ ").append(text).append(" §°10°(").append(uhrzeit).append(")°r°");
            }
            
            String title = String.format("History %s (%s Msgs)", target.getName(), anzahl);
            
            client.send(Popup.create(title, title, String.format("%s%s", title, his.toString()), 575, 400));
        } else if (cmd.equals("ig") || cmd.equals("ignore")) {
        	if(!client.hasPermission("cmd.ignore")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	arg = KCodeParser.escape(arg);
    		
    		if(arg.isEmpty()) {
    			if(client.getIgnoredNicks().isEmpty()) {
    				client.sendButlerMessage(channel.getName(), "Momentan ignorierst du niemanden.");
    			} else {
    				StringBuilder ignoredNicks = new StringBuilder();
    				int countNicks = 1;
    				
    				for(String nick : client.getIgnoredNicks().split("\\|")) {
    					if(!nick.isEmpty()) {
    						String name = nick.replace("<", "\\<");
    						
    						if(countNicks != 1) {
    							ignoredNicks.append(", ");
    						}
    						
    						ignoredNicks.append("°>_h").append(name).append("|/serverpp \"|/w \"<°");
    						countNicks++;
    					}
    				}
    				
    				client.sendButlerMessage(channel.getName(), String.format("Folgende Mitglieder werden momentan von dir ignoriert:#%s", ignoredNicks.toString()));
    			}
    			
    			return;
    		}

    		Client target = Server.get().getClient(arg);
    		boolean remove = false;
    		
    		if(arg.startsWith("!")) {
    			remove = true;
    			arg = arg.substring(1);
    		}
    		
    		if(target == null) {
    			target = new Client(null);
    			target.loadStats(arg);
    			
    			if(target.getName() == null) {
    				client.sendButlerMessage(channel.getName(), String.format("Wer ist %s?", arg));
    				return;
    			}
    		}
    		
    		String nick = target.getName();
    		String name = nick.replace("<", "\\<");
    		
    		if(remove) {
    			if(!client.checkIgnored(target.getName())) {
    				client.sendButlerMessage(channel.getName(), String.format("Du hast °>_h%s|/serverpp \"|/w \"<° niemals ignoriert!", name));
        			return;
    			}
    			
    			client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° wird von nun an nicht mehr von dir ignoriert!", name));
				client.removeIgnoredNick(target.getName());
    		} else {
    			int maxIgnoredNicks = client.getRank()*5+10;
    			int currentIgnoredNicks = countChars(client.getIgnoredNicks(), '|')/2;
    			String lastIgnoredNick = "";
    			
    			if(!client.getIgnoredNicks().isEmpty()) {
    				lastIgnoredNick = client.getIgnoredNicks().substring(1).split("\\|")[0];
    			}
    			
    			if(target == client) {
    				client.sendButlerMessage(channel.getName(), "Jeder hat mal Probleme, aber deshalb musst du dich doch nicht selbst ignorieren?!");
    				return;
    			}
    			
    			if(target.hasPermission("notignorable")) {
    				client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° kann nicht ignoriert werden.", name));
    				return;
    			}
    			
    			if(client.checkIgnored(target.getName())) {
    				client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° steht bereits auf ihrer Ignoreliste.", name));
    				return;
    			}
    				
    			client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° wird von nun an von dir _ignoriert_, was du mit _°>/ig !%s|\"<°_ rückgängig machen kannst.%s##°>{button}Notruf senden und über %s beschweren||call|/admincall complaint:%s<°", name, nick, currentIgnoredNicks == maxIgnoredNicks ? String.format("#Da deine Ignoreliste voll war, wurde %s wieder von deiner Liste entfernt.", lastIgnoredNick) : "", name, name));
    			
    			if(currentIgnoredNicks == maxIgnoredNicks) {
        			client.removeIgnoredNick(lastIgnoredNick);
    			}
    			
    			if(client.checkFriend(target.getName())) {
                	client.sendButlerMessage(channel.getName(), String.format("Da du %s nun ignorierst wurde %s von deiner Freundesliste entfernt.", target.getName(), target.getName()));	
                    client.setFriendlist(client.getFriendlist().replace(String.format("|%s|", target.getName()), ""));
                }
    			
    			client.addIgnoredNick(target.getName());
    		}
        } else if(cmd.equals("iplist")) {
        	if(!client.hasPermission("cmd.iplist")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
            
            String nickname = KCodeParser.escape(arg);
            Client target;
            
            if(arg.isEmpty()) {
                target = client;
            } else {
                target = Server.get().getClient(nickname);
            }
            
            if (target == null) {
                target = new Client(null);
                target.loadStats(nickname);

                if (target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), String.format("Wer ist %s?", nickname));
                    return;
                }
            }
            
            StringBuilder lol = new StringBuilder();
            
            if(client.getRank() > 5 && target.getRegisterIP() != null) {
            	lol.append("_Register-IP_:°%30°").append(target.getRegisterIP()).append("°%00°##");
            }
            
        	lol.append("_Uhrzeit_°%50°_IP-Adresse_°%00°##");
            
        	for(String[] infos : target.logins) {
                lol.append(infos[0]).append("°%50°").append(infos[1]).append("°%00°#");
        	}
            
            lol.append("#_Hinweis_: Mehrere, _zeitlich naheliegende Logins_ werden zu einem einzigen Login _zusammengefasst_.");
            
            client.send(Popup.create(String.format("IP List %s", target.getName()), String.format("IP List %s", target.getName()), lol.toString(), 400, 250));
        } else if(cmd.equals("statistik")) {
        	if(!client.hasPermission("cmd.statistik")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            StringBuilder s = new StringBuilder();
            
        	for(String question : Server.statistik.keySet()) {
        		String[] split = Server.statistik.get(question);
        		String uhrzeit = split[2];
        		String stimmen = split[1];
        		String text = split[0];
        		
                s.append(uhrzeit).append("#").append(stimmen).append(" Stimmen abgegeben#_").append(question).append("_#");
                
                for(String x : text.split("\\|")) {
                	s.append("#").append(x);
                }
                
                s.append("##");
        	}
        	
            client.send(Popup.create("Vergangene Umfragen", "Vergangene Umfragen", s.toString(), 400, 250));
        } else if (cmd.equals("kiss")) {
            if(muted(client, channel)) { 
            	return;
            }
            
            if(moderated(client, channel)) {
            	client.sendButlerMessage(channel.getName(), "Aufgrund einer _moderierten Veranstaltung_ kannst du nicht öffentlich sprechen. Privates Flüstern ist natürlich erlaubt.");
            	return;
            }
            
            if(!client.hasPermission("cmd.kiss")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
            
            for (long x : Server.actions.keySet()) {
            	String[] split = Server.actions.get(x);
            	Channel cha = Server.get().getChannel(split[3]);
            	String typ = split[0];
            	String v = split[1];
            	Client von = Server.get().getClient(v);
            	Client an = Server.get().getClient(split[2]);
            	
            	if(cha == channel && an == client && v.equals(arg) && typ.equals("kizz")) {
            		channel.broadcastPicAction(">>", String.format("°>_h%s|/serverpp \"<° nimmt °>_h%s|/serverpp \"|/w \"<° in den Arm und sie küssen sich liebevoll und zärtlich.", von.getName().replace("<", "\\<"), client.getName().replace("<", "\\<")), String.format("actKizz_ani-bg...h_20.my_3.png<>icons/actKizz_%s_ani...h_20.mx_-40.w_0.my_3.gif<>transparent1x1...w_0.gif", image(von, client)));
                    
                    if(von.getKisses() == 99) {
                        channel.broadcastMessage(String.format("Jetzt wird aber gefeiert! 100 Knutschflecken hat man nicht alle Tage, %s.", von.getName()), Server.get().getButler(), false);
                        channel.broadcastAction(Server.get().getButler().getName(), "beamt sich augenblicklich in die Küche und holt blitzschnell den eisgekühlten Aldi-Schampus aus dem Eisfach.");
                    }
                    
                    if(client.getKisses() == 99) {
                        channel.broadcastMessage(String.format("Jetzt wird aber gefeiert! 100 Knutschflecken hat man nicht alle Tage, %s.", client.getName()), Server.get().getButler(), false);
                        channel.broadcastAction(Server.get().getButler().getName(), "beamt sich augenblicklich in die Küche und holt blitzschnell den eisgekühlten Aldi-Schampus aus dem Eisfach.");
                    }
                    
                    von.increaseKisses();
                    client.increaseKisses();
            		Server.actions.remove(x);
            		return;
            	}
            }
            
            String nickname = KCodeParser.escape(arg);
            String msg = kiss[zufall.nextInt(kiss.length)];
            msg = msg.replace("[C]", String.format("°>_h%s|/serverpp \"|/w \"<°", client.getName().replace("<", "\\<")));
            
            if (nickname.isEmpty()) {
                client.sendButlerMessage(channel.getName(), "Ja, wen willst du denn küssen???");
                return;
            }

            if (nickname.equalsIgnoreCase(client.getName())) {
                client.sendButlerMessage(channel.getName(), "Du kannst Dich doch nicht selbst küssen!");
                return;
            }
            
            if(client.getRank() < 8) {
            	int kisse = client.getRank()*10+25;
            
            	if(client.getKissed() > kisse) {
            		client.sendButlerMessage(channel.getName(), "Du hast heute schon so viel geküsst, dass du bis morgen Pause machen musst.");
            		return;
            	}
            }

            Client target = Server.get().getClient(arg);
            boolean online = true;
            
            if (target == null) {
                online = false;
                target = new Client(null);
                target.loadStats(nickname);
                
                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(nickname));
                    return;
                }
            } 
            
            msg = msg.replace("[T]", String.format("°>_h%s|/serverpp \"|/w \"<°", target.getName().replace("<", "\\<")));
            msg = msg.replace("[K]", String.valueOf(nf.format(target.getKisses()+1)));
            
            if (!online) {
                client.sendButlerMessage(channel.getName(), userIsOffline(target));
                return;
            }
            
            if (!channel.getClients().contains(target)) {
                client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° hält sich im Moment _in einem anderen Channel_ auf.", target.getName().replace("<", "\\<")));
                return;
            }
            
            channel.broadcastPicAction(">", msg, String.format("actKiss_%s.png", image(client, target)));

            if(target.getKisses() == 99) {
                channel.broadcastMessage(String.format("Jetzt wird aber gefeiert! 100 Knutschflecken hat man nicht alle Tage, %s.", target.getName()), Server.get().getButler(), false);
                channel.broadcastAction(Server.get().getButler().getName(), "beamt sich augenblicklich in die Küche und holt blitzschnell den eisgekühlten Aldi-Schampus aus dem Eisfach.");
            }
            
            target.increaseKisses();
            channel.addHistory(client.getName(), String.format("küsst %s", target.getName()), false);
        } else if (cmd.equals("kizz")) {
        	if(!client.hasPermission("cmd.kizz")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            String nickname = KCodeParser.escape(arg);

            if (nickname.isEmpty()) {
                return;
            }

            if (nickname.equalsIgnoreCase(client.getName())) {
                client.sendButlerMessage(channel.getName(), "Du kannst Dich doch nicht selbst küssen!");
                return;
            }

            Client target = Server.get().getClient(nickname);

            if (target == null) {
                client.sendButlerMessage(channel.getName(), unknownUser(nickname));
            } else if (!channel.getClients().contains(target)) {
                client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° hält sich im Moment _in einem anderen Channel_ auf.", target.getName().replace("<", "\\<")));
            } else {
                client.sendButlerMessage(channel.getName(), String.format("Deine Lippen bewegen sich fordernd auf °>_h%s|/serverpp \"|/w \"<° zu...", target.getName().replace("<", "\\<")));
                target.sendButlerMessage(channel.getName(), String.format("Zungenkuss oder lieber nicht? °>_h%s|/serverpp \"|/w \"<°'s Lippen bewegen sich auf deine zu... °>finger.b.gif<° _°BB>_hZungenkuss erwidern|/kiss %s<°_", client.getName().replace("<", "\\<"), client.getName().replace("<", "\\<")));
                Server.actions.put(time, new String[] {"kizz", client.getName(), target.getName(), channel.getName(), "30"});
            }
        } else if (cmd.equals("knuddel")) {
            if(muted(client, channel)) { 
            	return;
            }
            
            if(moderated(client, channel)) {
            	client.sendButlerMessage(channel.getName(), "Aufgrund einer _moderierten Veranstaltung_ kannst du nicht öffentlich sprechen. Privates Flüstern ist natürlich erlaubt.");
            	return;
            }
            
            if(!client.hasPermission("cmd.knuddel")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
            
        	String nickname = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            int anzahl = 0;
            
            if (arg.length() > nickname.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            if(!msg.isEmpty() && msg.matches("[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)")) {
            	anzahl = Integer.parseInt(msg);
            }
            
            String mesg = knuddel[zufall.nextInt(knuddel.length)];
            mesg = mesg.replace("[C]", String.format("°>_h%s|/serverpp \"|/w \"<°", client.getName().replace("<", "\\<")));
            
            if (nickname.isEmpty()) {
                client.sendButlerMessage(channel.getName(), "Ja, wen willst du denn knuddeln???");
                return;
            }

            if (nickname.equalsIgnoreCase(client.getName())) {
                client.sendButlerMessage(channel.getName(), "Du kannst dich doch nicht selbst knuddeln!");
                return;
            }

            Client target = Server.get().getClient(nickname);
            boolean online = true;
            
            if (target == null) {
                online = false;
                target = new Client(null);
                target.loadStats(nickname);
                
                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(nickname));
                    return;
                }
            }
            
            mesg = mesg.replace("[T]", String.format("°>_h%s|/serverpp \"|/w \"<°", target.getName().replace("<", "\\<")));
            mesg = mesg.replace("[K]", String.valueOf(nf.format(target.getKnuddels()+1)));
            
            if (!online && msg.isEmpty()) {
                client.sendButlerMessage(channel.getName(), userIsOffline(target));
                return;
            }
            
            if(!msg.isEmpty()) {
                if(client.getKnuddels() < anzahl) {
                    client.sendButlerMessage(channel.getName(), noKnuddels[zufall.nextInt(noKnuddels.length)]);
                    return;
                }
            
                if(anzahl > 0) {
                    Popup popup = new Popup(String.format("Knuddels Überweisung an %s durchführen?", target.getName()), String.format("Knuddels Überweisung an %s durchführen?", target.getName()), String.format("#Bitte bestätige, dass du die Überweisung von##_%s an %s_##durchführen möchtest.", anzahl == 1 ? "einen Knuddel" : String.format("%s Knuddels", anzahl), target.getName()), 400, 250);
                    Panel panel2 = new Panel();
                    Button button = new Button("Bestätigen");
                    button.setStyled(true);
                    button.enableAction();
                    panel2.addComponent(button);
                    Button button3 = new Button("Ablehnen");
                    button3.setStyled(true);
                    panel2.addComponent(button3);
                    popup.addPanel(panel2);    

                    popup.setOpcode(ReceiveOpcode.KNUDDEL.getValue(), String.format("%s|%s", target.getName(), anzahl));
                    client.send(popup.toString());
                    return;
                }
            }
            
            if (!channel.getClients().contains(target)) {
                client.sendButlerMessage(channel.getName(), String.format("°>_h%s|/serverpp \"|/w \"<° hält sich im Moment _in einem anderen Channel_ auf.", target.getName().replace("<", "\\<")));
                return;
            } 
            
            if (client.getKnuddels() < 1) {
                client.sendButlerMessage(channel.getName(), noKnuddels[zufall.nextInt(noKnuddels.length)]);
                return;
            }
            
            channel.broadcastPicAction(">", mesg, String.format("actKnuddel_%s.png", image(client, target)));  
            client.deseaseKnuddels(1);
            target.increaseKnuddels(1);      
        } else if(cmd.equals("knuddelz")) {
        	if(!client.hasPermission("cmd.knuddelz")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
            
            if(muted(client, channel)) { 
            	return;
            }
            
            if(moderated(client, channel)) {
            	client.sendButlerMessage(channel.getName(), "Aufgrund einer _moderierten Veranstaltung_ kannst du nicht öffentlich sprechen. Privates Flüstern ist natürlich erlaubt.");
            	return;
            }
            
            if(arg.startsWith("+")) {
            	arg = arg.substring(1);	
            }

            
        	String image = "";
        
        	if(client.getGender() == 1) {
        		image = "m";
        	} else if(client.getGender() == 2) {
        		image = "f";
        	}
        	
        	Channel lol = Server.get().getChannel(arg);
        	
            if(arg.isEmpty() || lol != null && !lol.checkHz(client.getName())) {
            	if(client.getKnuddels() < channel.countClients()-1) {
            		client.sendButlerMessage(channel.getName(), noKnuddels[zufall.nextInt(noKnuddels.length)]);
            		return;
            	} 
            
            	StringBuilder nicks = new StringBuilder();
            	int lala = 1;
            
            	for(Client c : channel.getClients()) {
            		if(c != client) {
            			nicks.append(lala!=1?", ":"").append("°>_h").append(c.getName().replace("<", "\\<")).append("|/serverpp \"|/w \"<°");
            			c.increaseKnuddels(1);
            			lala++;
            		}
            	}
            	
            	String text = knuddelz[zufall.nextInt(knuddelz.length)].replace("[C]", client.getName()).replace("[T]", nicks.toString());
            
            	channel.broadcastPicAction(">>>", text, String.format("actKnuddelz_%s.png", image));
            	client.deseaseKnuddels(channel.countClients()-1);
            	return;
            }
            
            Channel ch = Server.get().getChannel(arg);

            if(ch == null) {
            	client.sendButlerMessage(channel.getName(), String.format("Der Channel _%s existiert nicht_.", arg));
            	return;
            }
            
            if(!ch.getClients().contains(client)) {
            	client.sendButlerMessage(channel.getName(), String.format("Du musst im Channel %s online sein um deine CMs knuddeln zu können.", ch.getName()));
            	return;
            }
            
            if(channel.getCmk() == 1) {
            	client.sendButlerMessage(channel.getName(), String.format("Diese Woche wurden die CMs im Channel %s bereits geknuddelt.", ch.getName()));
            	return;
            }
            
            int x = 0;
            StringBuilder cmk = new StringBuilder();
            for(Client c : ch.getClients()) {
        		if(c != client) {
        			if(ch.checkCm(c.getName())) {
        				cmk.append(x!=0?", ":"").append("°>_h").append(c.getName()).append("|/serverpp \"|/w \"<°");
        				x++;
        			}
        		}
            }
            
            if(x < 1) {
            	client.sendButlerMessage(channel.getName(), "Es muss mindestens ein CM im Channel online sein.");
            	return;
            }

        	ch.broadcastPicAction(">>>", String.format("HZ%s %s °RR°knuddelt°BB° %s CMs %s mal so richtig durch.", client.getRank() > 4 ? "A":"E", client.getName(), client.getGender() == 1 ? "seine":"ihre", cmk.toString()), String.format("actKnuddelz_%s.png", image));
            channel.setCmk(1);
            for(Client c : ch.getClients()) {
        		if(c != client) {
        			if(ch.checkCm(c.getName())) {
        				c.increaseKnuddels(1);
        			}
        		}
            }
        } else if(cmd.equals("kissall")) {
        	if(!client.hasPermission("cmd.kissall")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
            
            if(client.getKissall() == 1) {
            	client.sendButlerMessage(channel.getName(), "Du kannst dieses Feature momentan nicht benutzen.");
            	return;
            }
            
            StringBuilder nicks = new StringBuilder();
            int lala = 1;
            
            for(Client c : channel.getClients()) {
                if(!c.getName().equals(client.getName())) {
                    nicks.append(lala!=1?", ":"").append("°>_h").append(c.getName().replace("<", "\\<")).append("|/serverpp \"|/w \"<°");
                    c.increaseKisses();
                    lala++;
                }
            }
            
            String image = "";
            
            if(client.getGender() == 1) {
                image = "m";
            } else if(client.getGender() == 2) {
                image = "f";
            }
            
            channel.broadcastPicAction(">", String.format("°>_h%s|/serverpp \"|/w \"<° sprüht nur so vor Glück und küsst %s und damit den ganzen Channel ab.", client.getName().replace("<", "\\<"), nicks.toString()), String.format("actKissAll_%s.png", image));
            client.setKissall((byte)1);
        }else if(cmd.equals("loginlist")) {
            String nickname = KCodeParser.escape(arg);
            Client target;
            
            if(nickname.isEmpty() || client.getRank() < 8) {
                target = client;
            } else {
                target = Server.get().getClient(nickname);
            }
            
            if (target == null) {
                target = new Client(null);
                target.loadStats(nickname);

                if (target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(nickname));
                    return;
                }
            }
            
            StringBuilder lol = new StringBuilder("_Logindatum & Uhrzeit_##");
            List<String> logins = new ArrayList<String>();

            for(String[] infos : target.logins) {
                logins.add(infos[0]);
            }
            
            Collections.sort(logins);
            
            for(String infos : logins) {
                lol.append(infos).append("#");
            }
            
            lol.append("#_Hinweis_: Mehrere, _zeitlich naheliegende Logins_ werden zu einem einzigen Login _zusammengefasst_.##_Mehr Informationen zur \"Passwortsicherheit\"_ findest du unter _°BB>_h/h passwortsicherheit|\"<r°_.");
            
            client.send(Popup.create(String.format("Login List %s", target.getName()), String.format("Login List %s", target.getName()), lol.toString(), 400, 250));
        } else if(cmd.equals("lotto")) {
            if(arg.isEmpty()) {
            	if(Server.lotto.size() == 0) {
            		client.sendButlerMessage(channel.getName(), "Derzeit hat noch niemand bei Lotto gewonnen.");
            		return;
            	}
            	
                StringBuilder lotto = new StringBuilder("Hilfe, wie Lotto funktioniert, erhälst Du durch Eingabe von _/h lotto_. Hier die Liste der letzten Gewinner von der wöchentlichen Lottoausspielung:##(Nick, Gewonnene Knuddels, Gewinnzahl)");

                for(String datum : Server.lotto.keySet()) {
                	String[] split = Server.lotto.get(datum);
                	String name = split[0].replace("<", "\\<");
                	String zahl = split[1];
                	int knuddels = Integer.parseInt(split[2]);
                	
                	lotto.append("#").append(datum).append(": °>_h").append(name).append("|/serverpp \"|/w \"<° (").append(nf.format(knuddels)).append(" Knuddels, Zahl ").append(zahl).append(")");
                }

                client.send(Popup.create("Lotto", "Lotto", lotto.toString(), 400, 250));
                return;
            }
            
            if(!client.hasPermission("cmd.lotto")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}

            if(!Server.get().isInteger(arg)) {
            	client.sendButlerMessage(channel.getName(), "Bitte gib eine Zahl an.");
                return;
            }
            
            int zahl = Integer.parseInt(arg);
            
            if(zahl < 0 || zahl > 99) {
                client.sendButlerMessage(channel.getName(), "Bitte gib eine Zahl von 0-100 an.");
                return;
            }
        
            if(client.getKnuddels() < 2) {
                client.sendButlerMessage(channel.getName(), "Du hast leider weniger als die 2 benötigten Knuddels.");
                return;
            }
            
            if(client.getLotto() != 0) {
                client.sendButlerMessage(channel.getName(), String.format("Du hast bereits auf die Zahl %s gesetzt.", client.getLotto()));
                return;
            }
            
            client.sendButlerMessage(channel.getName(), String.format("Dein Einsatz auf die Zahl %s wurde registriert. 2 Knuddels wurden dir dafür abgezogen. Derzeit sind bereits %s Knuddels insgesamt gesetzt.", arg, Server.get().getLottoJackpot() * 2 + 2));
            client.deseaseKnuddels(2);
            client.setLotto(zahl);
            Server.get().increaseLottoJackpot(2);
        } else if(cmd.equals("move")) {
        	if(!client.hasPermission("cmd.move")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
            
            String re = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            Client target = Server.get().getClient(re);
            boolean online = true;
            
            if (arg.length() > re.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            msg = KCodeParser.escape(msg);
            
            if(re.isEmpty() || msg.isEmpty()) {
                client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaÃŸen benutzen:#/move NICK:CHANNEL#(Schiebt NICK in den CHANNEL.)");
                return;
            }
           
            if(target == null) {
                online = false;
                target = new Client(null);
                target.loadStats(re);
                
                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(re));
                    return;
                }
            }
            
            if(!online) {
                client.sendButlerMessage(channel.getName(), userIsOffline(target));
                return;
            }
            
            if(target.getName().equals(client.getName())) {
                client.sendButlerMessage(channel.getName(), "Du kannst dich nicht selbst verschieben!");
                return;
            }
            
            if(target.getName().equals(Server.get().getButler().getName())) {
                client.sendButlerMessage(channel.getName(), String.format("%s kann nicht verschoben werden.", Server.get().getButler().getName()));
                return;
            }
            
            if(target.getRank() > client.getRank()) {
                client.sendButlerMessage(channel.getName(), String.format("Du hast nicht die benötigten Rechte, %s zu verschieben.", target.getName()));
                return;
            }
            
            Channel channelTo = Server.get().getChannel(msg);
            
            if(channelTo == null) {
                client.sendButlerMessage(channel.getName(), String.format("Der Channel _%s existiert nicht_.", msg));
                return;
            }
            
            if(target.getChannels().contains(channelTo)) {
                client.sendButlerMessage(channel.getName(), String.format("%s ist bereits im Channel %s!", target.getName(), channelTo.getName()));
                return;
            }
            
            client.sendButlerMessage(channel.getName(), String.format("Du hast %s in den Channel %s verschoben.", target.getName(), channelTo.getName()));
            target.joinChannel(channelTo);
            target.send(PacketCreator.channelFrame(channelTo, target.getName()));
            channelTo.join(target);
            target.sendButlerMessage(channelTo.getName(), String.format("Du wurdest von %s in den Channel %s verschoben.", client.getName(), channelTo.getName()));
        } else if(cmd.equals("mute") || cmd.equals("cmute")) {
        	int typ;
        	
        	if(cmd.equals("mute")) {
        		typ = 3;
        	} else {
        		typ = 2;
        	}

        	if(!client.checkTeam("Spiele") && !client.checkTeam("Jugendschutz") && !channel.checkCm(client.getName()) && !channel.checkHz(client.getName())) {
        		if(client.getRank() < 5) {
                	client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                	return;
            	}        	
        	}
        	
        	String nick = KCodeParser.escape(arg).split(":", 2)[0].trim();
        	String msg = "";

        	if(nick.isEmpty()) {
                String mutedNicks = channel.getMutes().replace("||", ", ").replace("|", "");
                String cmutedNicks = channel.getCmutes().replace("||", ", ").replace("|", "");
                
                client.sendButlerMessage(channel.getName(), String.format("Folgende Bösewichte sind zwangsweise eingeschränkt (Mute & Colormute):#_Lokal_:%s%s", mutedNicks.isEmpty()?"":String.format("#_Muted_:#%s", mutedNicks), cmutedNicks.isEmpty()?"":String.format("#_Colormuted_:#%s", cmutedNicks)));
        		return;
        	}
        	
        	if (arg.length() > nick.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
        	
        	if (!nick.isEmpty() && arg.charAt(0) == '!') {
                nick = nick.substring(1).trim();
            }
        	
        	Client target = Server.get().getClient(nick);
        	boolean online = true;
        	
            if (target == null) {
            	online = false;
                target = new Client(null);
                target.loadStats(nick);

                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(nick));
                    return;
                }
            }
            
            if(arg.charAt(0) != '!' && !online) {
            	client.sendButlerMessage(channel.getName(), userIsOffline(target));
            	return;
            }
        	
            if(arg.charAt(0) == '!') {
				if(Server.get().checkCcm(target.getName(), channel, typ)) {
					for(Channel lala : target.getChannels()) {
						target.sendButlerMessage(lala.getName(), String.format("Du wurdest soeben von %s im Channel %s ent%s.", client.getName(), channel.getName(), cmd.equals("mute")?"mutet und kannst dort ab jetzt wieder öffentliche Nachrichten schreiben":"colormutet und kannst dort ab jetzt wieder Farben und Formatierungen in öffentlichen Nachrichten verwenden"));
					}
					
            		target.setComment(time, channel.getName(), String.format("Ent%smutet!", typ==3?"":"color"), client.getName(), "");
            		client.sendButlerMessage(channel.getName(), String.format("%s kann nun wieder weiter im Channel %s %s.", target.getName(), channel.getName(), cmd.equals("mute")?"nerven":"farbig schreiben und Smileys verwenden"));
            		
            		if(typ == 3) {
            			channel.setMutes(channel.getMutes().replace(String.format("|%s|", target.getName()), ""));
            		} else {
            			channel.setCmutes(channel.getMutes().replace(String.format("|%s|", target.getName()), ""));
            		}
            	} else {
            		client.sendButlerMessage(channel.getName(), String.format("%s steht nicht auf der %suteliste (%s).", target.getName(), cmd.equals("mute")?"M":"Colorm", channel.getName())); 
            	}
            	
            	return;
            }
            
            if(!target.getChannels().contains(channel)) {
            	client.sendButlerMessage(channel.getName(), String.format("%s hält sich in einem _anderen Channel_ auf.", target.getName())); 
            	return;
            }
            
            if(target.getRank() > 4) {
            	client.sendButlerMessage(channel.getName(), String.format("Sie haben nicht genügend Rechte, um %s zu muten.", target.getName()));
            	return;
            }
            
            if(msg.isEmpty()) {
            	client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/mute NICK:COMMENT oder !NICK oder nur /mute#(/mute NICK setzt den betreffenden Nick auf die Muteliste, !NICK entfernt diesen wieder. Nur /mute zeigt eine Liste der aktuell gemuteten Personen an.)");
            	return;
            }

            if(msg.length() < 10) {
            	client.sendButlerMessage(channel.getName(), "Ihre Begründung muss mindestens 10 Zeichen lang sein.");
            	return;
            }
           
            if(msg.length() > 350) {
            	client.sendButlerMessage(channel.getName(), "Ihre Begründung darf höchstens 350 Zeichen lang sein.");
            	return;
            }
            
            if(Server.get().checkCcm(target.getName(), channel, typ)) {
            	client.sendButlerMessage(channel.getName(), String.format("%s ist bereits in diesem Channel ge%smutet.", target.getName(), cmd.equals("mute") ? "":"color"));
            	return;
            }
            
            msg = KCodeParser.parse(client, msg, 5, 10, 20);
            msg = Server.get().parseSmileys(client, msg);
            
            target.setComment(time, channel.getName(), String.format("%sute!", cmd.equals("mute")?"M":"Colorm"), client.getName(), msg);
            
            if(cmd.equals("mute")) {
            	target.setMutes(target.getMutes()+1);
                target.sendButlerMessage(channel.getName(), String.format("Du wurdest soeben von %s im Channel %s _°BB>_hgemutet|/h mute<°§.#Begründung: %s", client.getName(), channel.getName(), msg));
            } else {
                target.setCmutes(target.getCmutes()+1);
                target.sendButlerMessage(channel.getName(), String.format("Du wurdest soeben von %s im Channel %s _°BB>_hgecolormutet|/h colormute<°§.#Begründung: %s", client.getName(), channel.getName(), msg));
            }

            client.sendButlerMessage(channel.getName(), String.format("%s wird jetzt erstmal im Channel %s %s.", target.getName(), channel.getName(), cmd.equals("mute")?"still sein":"keine Farben und Smileys mehr verwenden"));
            if(typ == 3) { // mute
            	channel.setMutes(String.format("%s|%s|", channel.getMutes(), target.getName()));
            } else {
            	channel.setCmutes(String.format("%s|%s|", channel.getMutes(), target.getName()));
            }
        }else if (cmd.equals("me")) {
        	if(!client.hasPermission("cmd.me")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            if(muted(client, channel)) { 
            	return;
            }
            
            if(moderated(client, channel)) {
            	client.sendButlerMessage(channel.getName(), "Aufgrund einer _moderierten Veranstaltung_ kannst du nicht öffentlich sprechen. Privates Flüstern ist natürlich erlaubt.");
            	return;
            }
            
            arg = KCodeParser.parse(client, arg, 5, 10, 20);
            arg = Server.get().parseSmileys(client, arg);

            if (!arg.isEmpty()) {
                channel.broadcastAction(client.getName(), arg);
            }
        } else if(cmd.equals("news")) {
        	if(!client.hasPermission("cmd.news")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            StringBuilder news = new StringBuilder();
            int id = 1;
            
            for(String[] infos : Server.news) {
            	int an = Integer.parseInt(infos[1]);
            	String uhrzeit = infos[3];
            	String text = infos[2];
            	String von = infos[0];
                String a = "Mitglieder";
            
                if(an == 1) a = "Familymitglieder";
                else if(an == 2) a = "Stammis";
                else if(an == 3) a = "Ehrenmitglieder";
                else if(an > 4 && an < 8) a = "Admins";
                else if(an > 7) a = "Sysadmins";
                
                if(client.getRank() >= an) {
                    news.append("#_News (").append(id).append(") von °>_h").append(von).append("|/serverpp \"|/w \"<° an alle °BB°").append(a).append("§##").append(text).append("§##geschrieben am ").append(uhrzeit).append("#");
                }
                
                id++;
            }
            
            String title = "+++ CuddyChat News Ticker +++";
            client.send(Popup.create(title, title, news.toString(), 575, 325));
        } else if (cmd.equals("p")) {
        	if(!client.hasPermission("cmd.p")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            int split = arg.indexOf(':');
            String info = "Bitte die Funktion folgendermaßen benutzen:#/p NICK:TEXT#(flüstert den TEXT an NICK, wobei auch mehrere Nicks mit Kommas getrennt werden können)";

            if (split < 1 || split == arg.length() - 1) {
                client.sendButlerMessage(channel.getName(), info);
                return;
            }

            String recipient = arg.substring(0, split);
            String[] recipients = recipient.split(",");

            if (recipients.length > 5 && client.getRank() < 5) {
                return;
            }

            List<Client> targets = new ArrayList<Client>();

            for (String rcp : recipients) {
                rcp = KCodeParser.escape(rcp);

                if (rcp.isEmpty()) {
                    continue;
                }

                Client target = Server.get().getClient(rcp);
                boolean online = true;
                
                if (target == null) {
                    online = false;
                    target = new Client(null);
                    target.loadStats(rcp);
                    
                    if(target.getName() == null) {
                        client.sendButlerMessage(channel.getName(), unknownUser(rcp));
                        return;
                    }
                } 
                
                if(!online) {
                    client.sendButlerMessage(channel.getName(), userIsOffline(target));
                    return;
                }
                
                if(target.checkIgnored(client.getName())) {
                    client.sendButlerMessage(channel.getName(), String.format("Sie werden von %s ignoriert.", target.getName()));
                    return;
                }
                
                if(target.getSilence() == 1 && client.getRank() < 5) {
                	client.sendButlerMessage(channel.getName(), String.format("%s können derzeit keine Nachrichten hinterlassen werden.", target.getName()));
                	return;
                }
                
                if (!targets.contains(target)) {
                    targets.add(target);
                }
                
                if(client.checkIgnored(target.getName())) {
                    client.sendButlerMessage(channel.getName(), String.format("_%s steht auf deiner Ignore-Liste_ und wird deshalb nicht antworten können. Mit _°BB>/ig !%s|\"<r°_ kannst du %s wieder von der Ignore-Liste löschen.", target.getName(), target.getName().replace("<", "\\<"), target.getName()));
                }
                
                if(target.getAge() < 14 && client.getAge() > 17) {
                	if(client.getChildJuSchuMessage() == 0) {
                		client.sendButlerMessage(channel.getName(), String.format("Hallo %s, bitte beachte, dass dein Gesprächspartner %s noch ein Kind ist. Für Gespräche mit Kindern gelten besondere Regeln, die du unbedingt beachten solltest. Die wichtigsten Regeln haben wir für dich auf einer _°BB>_hInformationsseite|<r°_ zusammengefasst.", client.getName(), target.getName()));
                		client.setChildJuSchuMessage((byte)1);
                	}
                }
            }

            if (targets.isEmpty()) {
                return;
            }

            String msg = arg.substring(split + 1);
            
            if(client.getGrippeStatus() > 0 && new Random().nextInt(10) == 5) {
            	msg = Server.get().textToIll(msg);
            }
            
        	client.sendPrivateMessage(targets, msg, channel, false);
        	
        	if(targets.contains(Server.get().getButler())) {
            	if(channel.getGame() == null) {
            		client.sendButlerMessage(channel.getName(), String.format(Butler.butlerT[zufall.nextInt(Butler.butlerT.length)], client.getName()));
            	}
            }
        	
        	if(targets.toString().contains(client.getMentor())) {
        		if(client.getMpChat() == 0) {
        			client.setMpChat((byte)1);
        		}
       
                }
                
                 /////////////////////////////////
                 //* Script: MyChannel        * //
                 //* Autor: (Localhost)       * //
                 //* Status: DEFEKT           * //
                 /////////////////////////////////
                
                
                ///// MyChannel START /////    
                
                /*  
        } else if (cmd.equals("mychannel")) {
        	if(arg.toLowerCase().equals("cmchannels")) {
        		client.sendButlerMessage(channel.getName(), "Du bist in keinem MyChannel CM.");
        		return;
        	}
        	
        	if(!client.hasPermission("cmd.mychannel")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	PacketCreator.createMyChannelWindow(client);
                */
                
                ///// MyChannel ENDE /////
                
                

                
                
         } else if(cmd.equals("ping")) {
        	if(!client.hasPermission("cmd.ping")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
                
     
       
                arg = KCodeParser.escape(arg);
        	
        	Client target = arg.isEmpty() ? client:Server.get().getClient(arg);
            boolean online = true;
                     
            if (target == null) {
            	online = false;
                target = new Client(null);
                target.loadStats(arg);

                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(arg));
                    return;
                }
            }

            if (!online) {
            	client.sendButlerMessage(channel.getName(), userIsOffline(target));
                return;
            }
                 
            client.sendButlerMessage(channel.getName(), String.format("Ping %s...", target.getName()));
        } else if (cmd.equals("points")) {
        	if(!client.hasPermission("cmd.points")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	arg = KCodeParser.escape(arg);
        	
        	Client target = arg.isEmpty() || client.getRank() < 11 ? client:Server.get().getClient(arg);
        	
        	if(target == null) {
        		target = new Client(null);
        		target.loadStats(arg);
        		
        		if(target.getName() == null) {
        			client.sendButlerMessage(channel.getName(), unknownUser(arg));
        			return;
        		}
        	}
        	
            StringBuilder points = new StringBuilder();
            String title = String.format("Spiele-Punkte - Übersicht %s", client != target ? String.format(" (%s)", target.getName()):""); 
            points.append("#WordMix:°%30°").append(nf.format((int)target.getWordMixPoints())).append("°%00°");
            points.append("#ThiefGame:°%30°").append(nf.format(target.getThiefGame())).append("°%00°");
            points.append("#Jumpo:°%30°").append(nf.format(target.getJumpopunkte())).append("°%00°");
            points.append("#High or Low:°%30°").append(nf.format(target.getHol())).append("°%00°");
            points.append("#Knuddels:°%30°").append(target.getKnuddels()).append("°%00°");
            client.send(Popup.create(title, title, points.toString(), 400, 250));
        } else if (cmd.equals("poll")) {
        	if(!client.hasPermission("cmd.poll")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}

        	client.send(PacketCreator.createPollWindow(arg.isEmpty()?null:channel.getName()));
        } else if(cmd.equals("readme")) {
        	if(!client.hasPermission("cmd.readme")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	int length;
        	
        	if(client.getRank() < 8) {
        		arg = KCodeParser.noKCode(arg);
        		
        		length = 60;
        	} else {
        		arg = KCodeParser.parse(client, arg, 0, 16, 16);
        		length = 120;
        	}
        	
            if(arg.isEmpty()) {
                client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/readme TEXT oder /readme !#(TEXT ist von allen einsehbar, auf deren Friendliste du stehst oder die dein Profil anschauen. Dieser TEXT bleibt bestehen, bis du ihn mit /readme ! löschst oder einen neuen speicherst.)");
            	return;
            }
        	
            if(arg.equals("!")) {
            	client.sendButlerMessage(channel.getName(), "Readme gelöscht.");
            	client.setReadme(null);
            	return;
            }
            
            
            if(arg.length() > length && !client.hasPermission("unlimitedchars")) {
                arg = arg.substring(0, length);
            }
            
            arg = Server.get().parseSmileys(client, arg);
        	
            int readmeZahl = client.readmes.size();
            client.sendButlerMessage(channel.getName(), String.format("%sAlle deine Freunde können nun folgenden Text in deinem Profil lesen: \\\"%s§\\\"%s", arg.length() > length ? "Da dein Text über 150 Zeichen enthielt, musste er gekürzt werden.#" : "", arg, readmeZahl>1?"  _°>_h[His]|/readmehis<°_":""));
            Server.get().query(String.format("INSERT INTO `readmes` SET `name` = '%s', `text` = '%s', `time` = '%s'", client.getID(), arg.replace("'", "\\'"), time));
            client.setReadme(arg);
            client.readmes.put(time, arg);
        } else if(cmd.equals("readmehis")) {
        	if(!client.hasPermission("cmd.readmehis")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            String nickname = KCodeParser.escape(arg).split(":", 2)[0].trim();
            String msg = "";
            Client target = nickname.isEmpty()?client:Server.get().getClient(nickname);
            
            if (arg.length() > nickname.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
            
            
            if(nickname.equals("del") && !msg.isEmpty()) {
                String title = String.format("Readme%s gelöscht", !msg.equals("all")?"":"-History");
                client.send(Popup.create(title, title, String.format("#%s wurde gelöscht.", msg.equals("all")?"Die gesamte History der Readmes":"Der Readme-Text"), 400, 250));
                Server.get().query(String.format("DELETE FROM `readmes` WHERE `name` = '%s'%s", client.getID(), msg.equals("all")?"":String.format(" AND `time` = '%s'", msg)));

                if(msg.equals("all")) {
                	client.readmes.clear();
                    client.setReadme(null);
                } else {
                	client.readmes.remove(Long.parseLong(msg));
                }
                
                return;
            }
            
            if (target == null) {
                target = new Client(null);
                target.loadStats(nickname);

                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(nickname));
                    return;
                }
            }
            
            StringBuilder readmehis = new StringBuilder().append("History von ").append(target.getName());
            StringBuilder texte = new StringBuilder();
        	
            String title = String.format("Readme History von %s", target.getName());
           	
            
            List<Long> sortedList = new ArrayList<Long>();
            sortedList.addAll(target.readmes.keySet());
            Collections.sort(sortedList);
            Iterator<Long> iter = sortedList.iterator();

            while (iter.hasNext()) {
            	Long uhrzeit = iter.next();
            	String text = target.readmes.get(uhrzeit);

                texte.append("##\"\"").append(text).append("§\"\"#°10°").append(Server.get().timeStampToDate(uhrzeit)).append(" ").append(Server.get().timeStampToTime(uhrzeit)).append("°r°");
            	
                if(target == client) {
                	texte.append("   °B>Löschen|/readmehis del:").append(uhrzeit).append("<r°");
                }
            }
            
            readmehis.append(texte.toString());
            Server.get();
			int readmeZahl = target.readmes.size();
            
            if(texte.toString().isEmpty() && readmeZahl < 2) {
            	client.sendButlerMessage(channel.getName(), String.format("%s hat keine Readme-History.", target.getName()));
            	return;
            }
        	
            if(target == client) {
            	readmehis.append("###°BB>History komplett löschen|/readmehis del:all<°");
            }
            
            client.send(Popup.create(title, title, readmehis.toString(), 450, 400));

        } else if(cmd.equals("register")) {
        	if(!client.hasPermission("cmd.register")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
            
        	arg = arg.toLowerCase();
        	String text = "Bitte die Funktion folgendermaßen benutzen:#/register on/off#(Die Registration ein- oder ausschalten.)";
        	
        	if(arg.isEmpty()) {
        		client.sendButlerMessage(channel.getName(), text);
        		return;
        	}
             
        	if(arg.equals("on") || arg.equals("off")) {
        		client.sendButlerMessage(channel.getName(), String.format("Die Registration wurde %sgeschaltet.", arg.equals("on") ? "ein" : "aus"));
        		Settings.setRegistration(arg.equals("on")?1:0);
        		Server.get().newSysLogEntry(client.getName(), String.format("Registration %sgeschaltet", arg.equals("on")?"ein":"aus"));
        		return;
        	}
             
        	client.sendButlerMessage(channel.getName(), text);
        } else if(cmd.equals("wm")) {
        	if(!client.hasPermission("cmd.wm")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
            
        	arg = arg.toLowerCase();
        	String text = "Bitte die Funktion folgendermaßen benutzen:#/wm on/off#(Den Wartungsmodus ein- oder ausschalten.)";
        	
        	if(arg.isEmpty()) {
        		client.sendButlerMessage(channel.getName(), text);
        		return;
        	}
             
        	if(arg.equals("on") || arg.equals("off")) {
        		Settings.setMaintenance(arg.equals("on")?1:0);
        		
        		if(arg.equals("on")) {
        			for (Object target : Server.get().getClients().toArray()) {
        	        	 Client ob = ((Client) target);
        	        	 
        	        	 if(ob.getRank() < 8) {
        	        		 ob.disconnect();
        	        	 }
        	         }
        		}
        		
        		client.sendButlerMessage(channel.getName(), String.format("Der Wartungsmodus wurde %sgeschaltet.", arg.equals("on") ? "ein" : "aus"));
        		Server.get().newSysLogEntry(client.getName(), String.format("Wartungsmodus %sgeschaltet", arg.equals("on")?"ein":"aus"));
        		return;
        	}
             
        	client.sendButlerMessage(channel.getName(), text);
        } else if (cmd.equals("rose")) {
        if(arg.equals("old")) {
            if(client.rosen.size() == 0) {
                client.sendButlerMessage(channel.getName(), "Du hast bisher keine Rosen erhalten.");
                return;
            }
                
            StringBuilder rose = new StringBuilder("Folgende Rosen wurden in letzter Zeit für Dich hinterlegt:#");
            
            for(String[] info : client.rosen) {
            	String von = info[0];
            	String text = info[1];
            	long uhrzeit = Long.parseLong(info[2]);
            	
                rose.append("#_Eine °>features/colorfulroses/rose_stem_01...h_20.w_98.my_5.png<>--<>features/colorfulroses/rose_head_01...h_20.w_0.mx_-98.my_5.png<° von °>").append(von.replace("<", "\\<")).append("|/serverpp \"|/w \"<°_:##").append(text).append("§#\"erhalten am ").append(Server.get().timeStampToDate(uhrzeit)).append(" ").append(Server.get().timeStampToTime(uhrzeit)).append("§##°-°");
            }
            
            client.send(Popup.create("Erhaltene Rosen", "Erhaltene Rosen", rose.toString(), 400, 250));
            return;
        }
        
        if(arg.equals("?")) {
            if(client.getRank() < 2) {
                client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                return;
            }
            
            client.sendButlerMessage(channel.getName(), String.format("Du kannst momentan _%s_ versenden.", (client.getRosesSend() == 0 ? "keine Rosen" : String.format("%s", (client.getRosesSend() == 1 ? "noch eine Rose" : String.format("noch %s Rosen", client.getRosesSend()))))));
            return;
        }
        
        String nickname = KCodeParser.escape(arg).split(":", 2)[0].trim();
        String msg = "";
        
        if (arg.length() > nickname.length()) {
            msg = arg.substring(arg.indexOf(':') + 1);
        }
        
        msg = KCodeParser.parse(client, msg, 5, 10, 20);
        msg = Server.get().parseSmileys(client, msg);
        
        if (nickname.isEmpty()) {
            if(client.getRank() < 2) {
                client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
                return;
            }

        	client.send(PacketCreator.createRoseWindow("", ""));
            return;
        }
        
        if(nickname.equals("colors") && !msg.isEmpty()) {
            Client target = Server.get().getClient(msg);
            
        	if (target == null) {
                target = new Client(null);
                target.loadStats(msg);

                if(target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(msg));
                    return;
                }
            }
        	
        	if(target.getRoses() == 0) {
        		client.sendButlerMessage(channel.getName(), String.format("%s hat bisher keine Rosen erhalten.", target.getName()));
                return;
        	}
        	
        	StringBuilder roses = new StringBuilder();
        	roses.append("k\0Erhaltene RosenõhÿÿÿãNl õgFhÿÿÿãSl õgFhÿÿÿãEl         õgFhÿÿÿãWl         õgFhÿÿÿãCpBCpBCc°13>{imageboxstart}boxS.my_-15.mh_30<20+9518+7025°_Erhaltene Rosen von °B°°>_h");
        	roses.append(target.getName().replace("<", "\\<"));
        	roses.append("|/serverpp \"|/w \"<°_#°K12+9505%02°°>{table|min25|min60|w1|min25}<12°°>{tc}<°°[202,202,255]>{colorboxstart}<K12° °+9505°°+9510>{tr}<>{tc}<+0000>RIGHT<+950314°_");
        	roses.append(target.getRoses());
        	roses.append(" ×_°>{tc}<>LEFT<°°>features/colorfulroses/rose_stem_00...h_20.w_98.my_5.png<>--<>features/colorfulroses/rose_head_01...h_20.w_0.mx_-98.my_5.png<° °>cc/bullet_blue_outlined...my_2.png<12° #°+0116+9017°_Rot_ (Liebe, Herzklopfen, Zärtlichkeit)#");
        	roses.append("°+9510°#°+9505°°[202,202,255]>{colorboxend}<°°>{endtable}<°#°+9510+0000>CENTER<°_°r>{button}Schließen||textborder|1|call|_c|width|110|heigth|28<°_°20°°>{imageboxend}<°õsï\0ÒtsendbackõhÿÿÿãSl õgFhÿÿÿãããã");
        	client.send(roses.toString());
        	return;
        }
        
        if(client.getRank() < 2) {
            client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
            return;
        }
        
        if (nickname.equalsIgnoreCase(client.getName())) {
            client.sendButlerMessage(channel.getName(), "Du kannst dir nicht selbst eine Rose schicken!");
            return;
        }
        
        if(client.getRosesSend() == 0) {
            client.sendButlerMessage(channel.getName(), "Du hast in dieser Woche bereits eine Rose versandt, mehr ist nicht möglich.");
            return;
        }
        
        Client target = Server.get().getClient(nickname);
        boolean online = true;

        if (target == null) {
            online = false;
            target = new Client(null);
            target.loadStats(nickname);

            if(target.getName() == null) {
                client.sendButlerMessage(channel.getName(), unknownUser(nickname));
                return;
            }
        }
        
        if(online) {
            client.sendButlerMessage(channel.getName(), String.format("%s ist im Chat online, Rosen können nur an Chatter vergeben werden, die offline sind.", target.getName()));
            return;
        }
        
        if (msg.isEmpty()) {
        	client.send(PacketCreator.createRoseWindow(target.getName(), ""));
            return;
        }
                
        client.sendButlerMessage(channel.getName(), String.format("Deine Rose wird %s schnellstens überreicht.", target.getName()));
        Server.get().newRose(client, target.getName(), msg, time);
        client.setRosesSend((byte) (client.getRosesSend() - 1)); 
     } else if (cmd.equals("save")) {
    	 if(!client.hasPermission("cmd.save")) {
     		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
     		return;
     	}
    	 
    	 StringBuilder nicks = new StringBuilder();
    	 int number = 1;
    	 
         for (Object target : Server.get().getClients().toArray()) {
        	 Client ob = ((Client) target);
             ob.saveStats();
             
             if(number != 1) {
            	 nicks.append(", ");
             }
             
             nicks.append("°>_h").append(ob.getName().replace("<", "\\<")).append("|/serverpp \"|/w \"<°");
             number++;
         }
         
         client.sendButlerMessage(channel.getName(), String.format("Die Profileigenschaften von %s wurden °RR°_gespeichert°r°_.", nicks.toString()));
     } else if (cmd.equals("serverpp")) {
    	 if(!client.hasPermission("cmd.serverpp")) {
     		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
     		return;
     	}
            
    	String nickname = KCodeParser.escape(arg);

        if (nickname.isEmpty()) {
            client.send(PacketCreator.createMessageWindow("", "", ""));
            return;
        }

        Client target = Server.get().getClient(nickname);

        if (target == null) {
          	target = new Client(null);
           	target.loadStats(nickname);
            	
           	if(target.getName() == null) {
                   client.sendButlerMessage(channel.getName(), unknownUser(nickname));
                   return;
           	}
            	
           	client.send(PacketCreator.createMessageWindow(arg, "", ""));
            return;
        }
            
        client.send(PacketCreator.privateChat(channel.getName(), target.getName()));
     } else if(cmd.equals("shop")) {
        	if(!client.hasPermission("cmd.shop")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	arg = KCodeParser.escape(arg);
            String type = arg.split(":", 2)[0].trim();
            String msg = "";
            
            if (arg.length() > type.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }
        
            if(type.equals("buy") && !msg.isEmpty() && Server.get().isInteger(msg)) {
            	int argInt = Integer.parseInt(msg);
            	List<Integer> sortedList = new ArrayList<Integer>();
        		sortedList.addAll(Server.smileyCategories.keySet());
        		Collections.sort(sortedList);
        		 
        		Iterator<Integer> iter = sortedList.iterator();
        		
        		while (iter.hasNext()) {
        			int x = iter.next();

            		if(argInt == x) {
            			String[] infos = Server.smileyCategories.get(argInt);
                		String name = infos[0];
                		int price = Integer.parseInt(infos[1]);
                		int knuddels = (int) client.getKnuddels();
                		
                		if(knuddels < price) {
                			client.sendButlerMessage(channel.getName(), "Du hast nicht genug Knuddels!");
                		} else {
                			String generatedCode = Password.generateRandom(19);
                			String code = String.format("%s-%s-%s-%s", generatedCode.substring(0, 4), generatedCode.substring(5, 9), generatedCode.substring(10, 14), generatedCode.substring(15, 19));
            			
                			client.sendButlerMessage(channel.getName(), String.format("Du hast dir einen _%s-Code gekauft_.", name));
                			
                			Server.get().newMessage(Server.get().getButler(), client.getName(), "Smileycode", String.format("Hallo %s,##hier ist dein soeben im Shop gekaufter Smileycode:#_°BB>%s|/code \"<r°_##Viel Spaß damit,#dein %s", client.getName(), code, Server.get().getButler().getName()), time);
                			//Code aktivieren mit Zeichen schon in aktiviert fenster
                			client.deseaseKnuddels(price);
                			Settings.setCodes(String.format("%s|%s~%s|", Settings.getCodes(), code, argInt));
                			//Manipulierung Applet
                			//Smileys +1
                		}
                		
                		return;
            		}
        		}

            	client.sendButlerMessage(channel.getName(), String.format("ID %s nicht vorhanden.", msg));
            	return;
            }
        
            StringBuilder shop = new StringBuilder();
            String title = String.format("Shop - %s Knuddels", client.getKnuddels());

            List<Integer> sortedList = new ArrayList<Integer>();
    		sortedList.addAll(Server.smileyCategories.keySet());
    		Collections.sort(sortedList);
    		 
    		Iterator<Integer> iter = sortedList.iterator();
    		
    		while (iter.hasNext()) {
    			int category = iter.next();
            	String[] infos = Server.smileyCategories.get(category);
            	String name = infos[0];
            	int price = Integer.parseInt(infos[1]);
            	
            	shop.append("#°[222,222,255]>{colorboxstart}<K11°_#    ");
            	shop.append(name).append(" °>cc/bullet_blue_outlined.png<° ").append(price).append(" Knuddels °>cc/bullet_blue_outlined.png<° °BB>_hKaufen|/shop buy:").append(category).append("<r°_##");

            	for(String[] inf : Server.smileys.values()) {
            		int cat = Integer.parseInt(inf[2]);
            		String replacement = inf[1];
            		
            		if(cat == category) {
            			shop.append("°>center<>").append(replacement).append("<°");
            		}
            	}

            	shop.append("##°>left<[255,255,255]>{colorboxend}<°#");
    		}
            
            shop.append("#");
            
            client.send(Popup.create(title, title, shop.toString(), 475, 442));
        } else if (cmd.equals("showcareer")) {
        	if(!client.hasPermission("cmd.showcareer")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            String nickname = KCodeParser.escape(arg);
            
            if(nickname.isEmpty()) {
                nickname = client.getName();
            }
            
            Client target = Server.get().getClient(nickname);
            
            if (target == null) {
                target = new Client(null);
                target.loadStats(nickname);

                if (target.getName() == null) {
                    client.sendButlerMessage(channel.getName(), unknownUser(nickname));
                    return;
                }
            }
            
            StringBuilder career = new StringBuilder();
            String title = String.format("Laufbahn von %s", target.getName());
            career.append("#°%04°").append(target == Server.get().getButler() ? "21.05.1935" : target.getRegistrationDate()).append("°%34°Registration°%00°");
              
            if(!target.getCareer().isEmpty()) {
            	for(String out : target.getCareer().split("\\|")) {
            		if(!out.isEmpty()) {
            			String datum = out.split(" ")[0];
            			String text = out.split(" ", 2)[1];
    			
            			career.append("#°%04°").append(datum).append("°%34°").append(text).append("°%00°");
            		}
            	}
    		}
                    
            client.send(Popup.create(title, title, career.toString(), 400, 250));
        } else if (cmd.equals("shutdown")) {
        	if(!client.hasPermission("cmd.shutdown")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
            
            for (Object target : Server.get().getClients().toArray()) {
                ((Client) target).disconnect();
            }

            Server.get().newSysLogEntry(client.getName(), "Chatserver ausgeschaltet");
            System.exit(0);
            
            
            // Aus Sicherheitsgründen deaktiviert @ Kokos-Ice
            
            
      /*  } else if(cmd.equals("sql")) {
        	if(!client.hasPermission("cmd.sql")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
            
            if(arg.isEmpty()){
                client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/sql TEXT#(Führt TEXT als SQL-Befehl aus.)");
                return;
            }
            
            String argLow = arg.toLowerCase();
            
            
             
            
            
            if(argLow.contains("delete") || argLow.contains("drop") || argLow.contains("truncate")) {
            	if(!client.getName().equals("DEIN NAME")) {
            		client.sendButlerMessage(channel.getName(), "Die Befehle 'delete', 'truncate' und 'drop' können aus Sicherheitsgründen nicht ausgeführt werden.");
            		return;
            	}
            }*/
            	
            if(arg.toLowerCase().contains("knuddels")) {
            	client.sendButlerMessage(channel.getName(), "Aus Sicherheitsgründen nicht möglich.");
            }
                
            PoolConnection pcon = ConnectionPool.getConnection();
            PreparedStatement ps = null;

            try {
                Connection con = pcon.connect();
                ps = con.prepareStatement(arg);
                ps.executeUpdate();
            } catch (SQLException e) {
                client.sendButlerMessage(channel.getName(), String.format("Es ist ein _Fehler aufgetreten_: %s.°RR%%10##°_%s°%%00°", arg, e.getMessage()));
                return;
            } finally {
                if (ps != null) {
                    try {
                        ps.close();
                    } catch (SQLException e) {
                    }
                }

                pcon.close();
            }
            
            client.sendButlerMessage(channel.getName(), String.format("Der Text wurde als _SQL-Befehl ausgeführt_ (%s).", arg));
        } else if (cmd.equals("time")) {
        	if(!client.hasPermission("cmd.time")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            Date dat = new Date();
            String[] days = { "Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};
                
            client.sendButlerMessage(channel.getName(), String.format("Heute ist %s, %s %s.", days[dat.getDay()], Server.get().timeStampToDate(time), Server.get().timeStampToTime(time)));
        } else if (cmd.equals("top")) {
        	if(!client.hasPermission("cmd.top")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	arg = KCodeParser.escape(arg);
        	arg = arg.toLowerCase();
        	
        	if(arg.equals("age")) {
        		StringBuilder top = new StringBuilder();
        		StringBuilder nicks = new StringBuilder();
        		ArrayList<String> unsortiert = new ArrayList<String>(); 
        		int clientsWithoutButler = channel.countClients()-1;
        		String title = String.format("Top-%s-age", clientsWithoutButler);
        		
        		int lala = 0;
        		int lala2 = 1;
        		float male = 0;
        		float female = 0;
        		
        		for(Client x : channel.getClients()) {
        			if(x != Server.get().getButler()) {
        				lala+=x.getAge();
        				unsortiert.add(String.format("%s~%s~%s", x.getAge(), x.getName(), x.getGender()));
        				
        				if(x.getGender() == 2) {
        					female++;
        				} else if(x.getGender() == 1) {
        					male++;
        				}
        			}
        		}
        		
        		Collections.sort(unsortiert);
        		
        		female = female/clientsWithoutButler*100;
        		male = male/clientsWithoutButler*100;
        		
        		top.append("Durchschnitt: ").append(lala/clientsWithoutButler).append(" Jahre, ").append(df.format(female).replace(",00", "")).append("% °>female.png<°  ").append(df.format(male).replace(",00", "")).append("% °>male.png<°#");
        		
        		for(String x : unsortiert) {
        			String[] split = x.split("~");
        			nicks.append("#").append(lala2).append(". ").append(split[1]).append(" ");
        			int gender = Integer.parseInt(split[2]);
        			
        			if(gender == 1) {
        				nicks.append("°>male.png<°");
        			} else if(gender == 2) {
        				nicks.append("°>female.png<°");
        			}
        			
    				nicks.append(" (").append(split[0]).append(")");
    				lala2++;
        		}
        		
        		top.append(nicks);
        		
        		client.send(Popup.create(title, title, top.toString(), 350, 250));
        		return;
        	}
        	
        	if(arg.equals("online")) {
        		StringBuilder top = new StringBuilder();
        		StringBuilder nicks = new StringBuilder();
        		int clientsWithoutButler = channel.countClients()-1;
        		String title = String.format("Top-%s-online", clientsWithoutButler);
        		int lala = 0;
        		int lala2 = 1;
        		
        		for(Client x : channel.getClients()) {
        			if(x != Server.get().getButler()) {
        				lala+=x.getOnlineTime();
        				nicks.append("#").append(lala2).append(". ").append(x.getName()).append(" ");
        				
        				lala2++;
        				
        				nicks.append(" (").append(nf.format(x.getOnlineTime()/60)).append(")");
        			}
        		}
        		
        		
        		top.append("Durchschnitt: ").append(nf.format((lala/clientsWithoutButler)/60)).append(" Minuten#").append(nicks);
        		
        		client.send(Popup.create(title, title, top.toString(), 350, 250));
        		return;
        	}
        	
        	if(Server.toplisten.containsKey(arg)) {
        		String[] split = Server.toplisten.get(arg);
        		String name = split[0];
        		String text = split[1];
        		String word = arg;
        		
                int what, zahl = 1;
                boolean showPoints = true;
                
                if(word.equals("wordmix")) {
                    what = 100;
                } else {
                    if(word.equals("quasselig") || word.equals("knuddelig")) {
                        showPoints = false;
                    }
                    
                    what = 0;
                }
                
                StringBuilder top = new StringBuilder();
                top.append(text);
                StringBuilder nicks = new StringBuilder();
                
        		PoolConnection pcon = ConnectionPool.getConnection();
                PreparedStatement ps = null;

                try {
                    Connection con = pcon.connect();
                    ps = con.prepareStatement(String.format("SELECT name, %s from accounts where name != '%s' and %s > '%s' order by %s desc limit 15", name, Server.get().getButler().getName(), name, what, name));
                    ResultSet rs = ps.executeQuery();
                        
                        while(rs.next()) {
                        	String nam = rs.getString("name");
                        	int x = rs.getInt(name);
                            nicks.append("#").append(zahl).append(". ").append(nam).append(" ");
                            
                            if(showPoints){   
                            	nicks.append("(");
                            	
                            	if(word.startsWith("online ")) {
                            		nicks.append(x/60);
                            	} else {
                            		nicks.append(x);
                            	}
                            	
                            	nicks.append(")");
                            }
                            
                            zahl++;
                        }
                        
                        top.append("#").append(nicks.toString());
                        client.send(Popup.create(String.format("Top-%s-%s", zahl-1, word), String.format("Top-%s-%s", zahl-1, word), top.toString(), 400, 250));
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    if (ps != null) {
                        try {
                            ps.close();
                        } catch (SQLException e) {
                        }
                    }

                    pcon.close();
                }
        		
        		return;
        	}
        	
        	StringBuilder toplisten = new StringBuilder();
            
            for(String top : Server.toplisten.keySet()) {
            	toplisten.append(", ").append(top);
            }
            
            client.sendButlerMessage(channel.getName(), String.format("%sEs gibt folgende Listen: Age, Online%s", arg.isEmpty() ? "" : String.format("Die Topliste %s gibt's hier leider nicht. ", arg), toplisten.toString()));
        } else if (cmd.equals("topic")) {
        	if(!client.hasPermission("cmd.topic") && !channel.checkHz(client.getName())) { 
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	
        	if(arg.isEmpty()) {
        		client.sendButlerMessage(channel.getName(), "Bitte die Funktion folgendermaßen benutzen:#/topic TEXT oder !#(Ändert das Channelthema in TEXT oder löscht es.)");
        		return;
        	}
        	
            if (arg.equals("!")) {
                client.sendButlerMessage(channel.getName(), "Das Thema wurde gelöscht.");
                channel.setTopic(null);
                return;
            }
            
            arg = Server.get().parseSmileys(client, arg);
            channel.setTopic(arg);
        } else if(cmd.equals("verify")) {
        	if(!client.hasPermission("cmd.verify")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            Popup popup = new Popup("Altersverifikation", "Altersverifikation", "Für diese Altersverifikation benötigst du deinen _Personalausweis_. Nur die _letzte Zeile ganz unten_ auf der Vorderseite des Personalausweises wird eingeben. Sie besteht aus vier Zahlen, die durch << getrennt sind. Bitte gib diese nun in der richtigen Reihenfolge unten ein.##Hinweis: Die von dir eingegebenen Daten werden _nicht_ personenbezogen gespeichert. Bitte bedenke, dass du nur _einen_ Nick mit deiner Personalausweisnummer verifizieren kannst. Nach der Verifikation wird dein Geburtsdatum der Ausweisnummer entnommen und in deiner Info _permanent_ eingetragen.", 500, 250);
            Panel panel1 = new Panel();
            panel1.addComponent(new TextField(10));
            panel1.addComponent(new Label("<<"));
            panel1.addComponent(new TextField(7));
            panel1.addComponent(new Label("<"));
            panel1.addComponent(new TextField(7));
            panel1.addComponent(new Label("<<<<<<<"));
            panel1.addComponent(new TextField(1));
            popup.addPanel(panel1);
            Panel panel2 = new Panel();
            Button button = new Button("Absenden");
            button.setStyled(true);
            button.enableAction();
            button.disableClose();
            panel2.addComponent(button);
            popup.addPanel(panel2);
                    
            popup.setOpcode(ReceiveOpcode.VERIFY.getValue(), "verify");
            client.send(popup.toString());
        } else if (cmd.equals("wc")) {
        	if(!client.hasPermission("cmd.wc")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
            arg = KCodeParser.escape(arg);
            Channel channelTo = Server.get().getChannel(arg);
            
            String nickname = KCodeParser.escape(arg).split(":", 2)[0].trim().toLowerCase();
            String msg = "";
            
            if (arg.length() > nickname.length()) {
                msg = arg.substring(arg.indexOf(':') + 1);
            }

            StringBuilder wc = new StringBuilder();
            
            if (arg.isEmpty() || nickname.equals("cat") && Server.get().isInteger(msg)) {
                if(!nickname.equals("cat")) {
            	int channels = Server.get().getChannels().size();
                int online = Server.get().getClients().size();
                
                wc.append("#_Channels insgesamt_:_°%46°").append(channels).append("°%00°_#_öffentliche_ Channels: _°%46°").append(channels).append("_°%56° (").append(online).append(")°%00°#_private_ Channels: _°%46°0°%00°_##");
            
                for (Channel names : Server.get().getChannels()) {
                	if(names.isVisible()) {
                		wc.append("°>_h").append(names.getName()).append("|/go \"|/go +\"<° (").append(names.countClients()).append(")");
                		
                		if(names.countClients() == names.getSize()) {
                			wc.append(" °>icon_fullChannel.gif<°");
                		}
                		
                		if(names.getSpecialEvent() == 1) {
                			wc.append(" °>icon_specialEventChannel.gif<°");
                		}
                		
                		wc.append("#");
                	}
                }} else {
                	
                	int channels = 0;
                    int online = 1;
                	int category = Integer.parseInt(msg);
                    
                    for(Channel names : Server.get().getChannels()) {
                    	if(names.isVisible() && names.getCategory() == category) {
                    		channels++;
                    		online+=names.countClients()-1;
                    	}
                	}
                    
                    wc.append("#_Channels insgesamt_:_°%46°").append(channels).append("°%00°_#_öffentliche_ Channels: _°%46°").append(channels).append("_°%56° (").append(online).append(")°%00°#_private_ Channels: _°%46°0°%00°_##");
                
                    for (Channel names : Server.get().getChannels()) {
                    	if(names.isVisible() && names.getCategory() == category) {
                    		wc.append("°>_h").append(names.getName()).append("|/go \"|/go +\"<° (").append(names.countClients()).append(")");
                    		
                    		if(names.countClients() == names.getSize()) {
                    			wc.append(" °>icon_fullChannel.gif<°");
                    		}
                    		
                    		if(names.getSpecialEvent() == 1) {
                    			wc.append(" °>icon_specialEventChannel.gif<°");
                    		}
                    		
                    		wc.append("#");
                    	}
                    }
                }
                
                wc.append("##_Stand_: ").append(Server.get().timeStampToDate(time)).append(" um ").append(Server.get().timeStampToTime(time)).append(" Uhr");
                client.send(Popup.create("Channels", "Channels", wc.toString(), 400, 250));
                return;
            }
            
            if (channelTo == null) {
                client.sendButlerMessage(channel.getName(), String.format("Der Channel _%s existiert nicht_.", arg));
                return;
            }
            
            if(!channelTo.isVisible() && channelTo != channel) {
            	client.sendButlerMessage(channel.getName(), String.format("Der Channel %s ist unsichtbar.", channelTo.getName()));
                return;
            }
            
            StringBuilder wc2 = new StringBuilder("#");   
            int cC = 1; 
            String title = String.format("Chatter im %s (%s)", channelTo.getName(), channelTo.countClients());
        
            if(channelTo.getTopic() != null) {
                wc2.append("_Topic:#").append(channelTo.getTopic()).append("_##");
            }
            
            for (Client eNick : channelTo.getClients()) {
                wc2.append(cC != 1 ? ", " : "").append("°>_h").append(eNick.getName().replace("<", "\\<")).append("|/serverpp \"|/w \"<°");
                cC++;
            }
                
            client.send(Popup.create(title, title, wc2.toString(), 400, 250));
        } else if (cmd.equals("wordmix")) {
        	if(!client.hasPermission("cmd.wordmix")) {
        		client.sendButlerMessage(channel.getName(), "Diese Funktion steht dir hier nicht zur Verfügung.");
        		return;
        	}
        	
        	if(WordMixRecord.getPoints() == 0) {
        		client.send(Popup.create("Bestleistung bei WordMix", "Bestleistung bei WordMix", "Bisher hat niemand den Tagesrekord aufgestellt.", 640, 475));
        		return;
        	}
        	
            String nickname = String.format("°20B>_h%s|/serverpp \"|/w \"<r°", WordMixRecord.getNick().replace("<", "\\<"));
            float nPoints = WordMixRecord.getPoints();
            String nSentence = WordMixRecord.getSentence();
            float nSeconds = WordMixRecord.getSeconds();
            String showString = String.format("°28°_WordMix Bestleistung des Tages:_°15°###_%s_ °15° erreichte _°20°%s Punkte°r°_°15° mit folgendem Satz:##°20°_\"\"%s_\"\"°15°##(in _%s_ Sekunden)##", nickname, df.format(nPoints), nSentence, df.format(nSeconds));

            if (nPoints > 0.00f) {
                client.send(Popup.create("Bestleistung bei WordMix", "Bestleistung bei WordMix", showString, 640, 475));
            } else {
               client.send(Popup.create("Bestleistung bei WordMix", "Bestleistung bei WordMix", "Bisher hat niemand den Tagesrekord aufgestellt.", 640, 475));
            }
        } else {
        	if(!fromGame && channel.getGame() != null && !channel.getGame().parseCommand(message, client) || cmd.equals("po") || cmd.equals("io") || cmd.equals("importantonly") || cmd.equals("privateonly")) {
        		return;
        	}
        
        	client.sendButlerMessage(channel.getName(), String.format("Die Funktion /%s gibt's hier leider nicht.", cmd));
        }
    }
}
