using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace KNBot
{

class KNClient
{
KNLib.Applet applet = new KNLib.Applet();
KNLib.Client client;
public delegate void voidHandler();
public delegate void oneStringHandler(String handler);
public delegate void twoStringHandler(String handler,String handler2);
public delegate void threeStringHandler(String handler,String handler2, String handler3);
private bool loginAble = false;


public event threeStringHandler newPrivate;
public event threeStringHandler newPublic;
public event twoStringHandler newMe;
public event threeStringHandler newPopup;
public event threeStringHandler newUser;
public event oneStringHandler userLeft;
public event oneStringHandler allTokens;
public event oneStringHandler leftTokens;



public bool isLoginAble()
{ return loginAble; }

public void logout()
{
client.Send("d\0");


}


public int timeLeft()
{
return (int)(lastAction + 600 - time());
}

public void sendToken(String token)
{
lastAction = time();
client.Send(token);
}


private void handleTokens(KNLib.Client client, String tokenO)
{
String[] token = tokenO.Split('\0');
tokenO = tokenO.Replace("\0", "\\0");
if (allTokens != null) allTokens(tokenO);
if (token[0] == "(") loginAble = true;
else if (token[0] == "r" && newPrivate != null) newPrivate(token[1], token[2], token[4]);
else if (token[0] == "e" && newPublic != null) newPublic(token[1], token[3], tokenO);
else if (token[0] == "k" && newPopup != null) newPopup(token[1], token[4], token[7]);
else if (token[0] == "l" && newUser != null) newUser(token[2].Split('\n')[0], token[5], token[6]);
else if (token[0] == "w" && userLeft != null) userLeft(token[1]);
else if (token[0] == "t" && newMe != null) newMe(token[1], token[3]);
else if (token[0] == "u" && newUser != null)
{
//\0-\0
string[] stringSeparators = new string[] { "\\0-\\0" };
String[] result = tokenO.Split(stringSeparators, StringSplitOptions.None);
stringSeparators = new string[] { "\\0" };
for(int i = 1; i < result.Length; i++)
{
String[] user = result[i].Split(stringSeparators, StringSplitOptions.None);
newUser(user[0].Split('\n')[0], user[1], user[2]);

}




}
else if (leftTokens != null) leftTokens(tokenO);

}

long lastAction;
private long time()
{
return (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
}
public void login(String nick, String pass, String chan)
{
client.Login(nick, pass, chan);
}
public KNClient()
{
client = new KNLib.Client(applet);
client.Receive += new KNLib.Client.ReceiveHandler(this.handleTokens);

}
public void connect(String host, int port)
{
client.Connect(host, port);
lastAction = time();
}
public void connect(String host, int port, String proxy, int proxyport)
{
client.Connect(host,port,proxy, proxyport);
lastAction = time();
}
public void disconnect()
{
client.Disconnect();
}
public String toString()
{
return client.ToString();
}


}
}

P.S. Es ist noch nicht vollständig!

Handler:
allTokens - String Original // alle Tokens => vgl ReceiveHandler
newPrivate - String Sender, String Empfänger, String Nachricht //bei neuer P-Nachricht
newPublic - String Sender, String Nachricht, String OriginalNachricht // bei neuer Öffentlichen Nachricht
newPopup - String title, Sting header, String text // Wenn ein Popup sich öffnen soll
newUser - String Name, String Farbe, String Bilder // wenn ein User joined (auch bei Userliste laden)
newMe - String User, String nachricht //wenn eine neue Aktion (t-Token stattfindet)
userLeft - String user //wenn ein User leaved
leftTokens - String OriginalToken //wenn andere Tokens vorhanden sind


Wichtig: Die Tokens sind nicht per 0-Char bei mir getrennt, sondern per "\\0"



Keine Garantie auf vollständigkeit und richtigkeit.