Nicht sehr vollständig, aber working :o
Verbesserungen und Bugreports gerne gesehen.

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


/* Abgearbeitete Pakete
* OUT:
* e - OutPublicMessage
* e - OutPrivateMessage
* h - OutPingAnswer
* post - OutMailMessage
* e - OutMailMessage
*
* IN:
* e - InPublicMessage
* , - InPingReceive
* r - InPrivateMessage
*
* */

//post\0post\0Senden\0Receiver\0Subject:\01\0Message\0
/*
* opcode
* post
* Action
* Empfänger
* Betreff
* Signatur ja/nein (1/0)
* Nachricht
* ?
* */
namespace KNDeKaDeNz.Net
{





public class Packet
{
public readonly static string version = "0.1b";



internal String packet = "";
internal String[] tokens;
internal DateTime _time;
public DateTime time
{
get
{
if(_time==null)
_time = DateTime.Now;
return _time;
}


}

public Packet()
{
_time = DateTime.Now;
this.packet = "";
tokens = packet.Split('\0');
}
public Packet(String packet)
{
_time = DateTime.Now;
this.packet = packet;
tokens = packet.Split('\0');
}
public String me
{
get { return packet; }
set { packet=value; tokens = packet.Split('\0'); }
}

public String this[int index]
{
get
{
if (tokens.Length > index) return tokens[index];
return null;
}
set
{
if (tokens.Length > index) tokens[index] = value;
rebuild();
}

}
internal void rebuild()
{
packet = "";
foreach (String tok in tokens)
{
packet += tok + "\0";
}
packet = packet.Substring(0, packet.Length - 1);
tokens = packet.Split('\0');


}
override public String ToString() { return packet; }
public static Packet getRealPacket(String msg, bool send)
{
try
{
String pack = getRealPacketName(msg, send);
Type type = Type.GetType("KNDeKaDeNz.Net." + pack);
Object obj = Activator.CreateInstance(type, msg);
return (Packet)obj;
}
catch(Exception e)
{
Console.WriteLine("CAST ERROR:" + e.Message);
return new Packet();
}
}
public static String getRealPacketName(Packet p, bool send)
{
return getRealPacketName(p.packet,send);
}
public static String getRealPacketName(String msg, bool send)
{
if(send)
{
if (msg[0] == 'h') return "OutPingAnswer";
if (msg[0] == 'e')
{
try { new OutPrivateMessage(msg); return "OutPrivateMessage"; }
catch { }
return "OutPublicMessage";
}
}
if (msg[0] == ',') return "InPingReceive";
if (msg[0] == 'e') return "InPublicMessage";
if (msg[0] == 'r') return "InPrivateMessage";


return "Packet";
}

}
public class WrongPacketException : Exception
{
public WrongPacketException(String msg) : base(msg.Replace("\0", "\\0")) { }
}

public class InPingReceive : Packet
{
private String _nick;
private Int64 _pingID;

public OutPingAnswer getAnswer()
{
if (_nick == null) return new OutPingAnswer();
return new OutPingAnswer(_nick, _pingID);
}

public InPingReceive(String nick, Int64 pingID)
{
_time = DateTime.Now;
this._nick = nick;
this._pingID = pingID;
this.packet = ",\0"+nick + "|" + pingID;
this.tokens = packet.Split('\0');
}

public InPingReceive(String msg) : base(msg)
{
if (msg[0] != ',') throw new WrongPacketException("\n" + msg + "\nis not a ping receive");
if (msg == ",") { _nick = null; _pingID = 0; }
else
{
Console.WriteLine(msg.Replace("\0", "\\0"));
string[] info = this[1].Split('|');

if (info.Length != 2) throw new WrongPacketException("\n" + msg + "\nis not a valid ping receive");
_nick = info[0].Trim();
try { _pingID = Int64.Parse(info[1].Trim()); }
catch { throw new WrongPacketException("\n" + msg + "\nis not a valid ping receive"); }
}

}
public String nick
{
set
{
if (value == null)
{
_nick = null;
_pingID = 0;
this.packet = ",";
}
else
{
_nick = value;
this.packet = ",\0" + _nick + "|" + _pingID;
}
this.tokens = packet.Split('\0');
}
get { return _nick; }
}
public Int64 pingID
{
set
{
if (_nick == null) _nick = "";
_pingID = value;
this.packet = ",\0" + _nick + "|" + _pingID;
this.tokens = packet.Split('\0');

}
get { return _pingID; }
}


}
public class InPublicMessage : Packet
{
public InPublicMessage(String message, String channel, String from)
{
_time = DateTime.Now;
packet = "e\0"+from+"\0"+channel+"\0"+message+"\0";
tokens = packet.Split('\0');
}


public InPublicMessage(String packet) : base(packet)
{
if(tokens[0] != "e") throw new WrongPacketException("\n"+packet+"\nis not a public message");
}

public String message {
get { return this[3]; }
set { this[3] = value; }
}
public String channel {
get { return this[2]; }
set { this[2] = value; }
}
public String from {
get { return this[1]; }
set { this[1] = value; }
}
public String picUrl {
get { if(this[4].Trim() == "") return null; return this[4]; }
set
{
if(this[4].Trim() == "")
{
packet = "e\0"+from+"\0"+channel+"\0"+message+"\0"+value+"\0"+from+"\0"+"0"+"\0"+"10";
tokens = packet.Split();
}
else { this[4] = value; }
}
}
}
public class InPrivateMessage : Packet
{
public InPrivateMessage(String message, String channel, String from, String to, String channelOfSender)
{
_time = DateTime.Now;
packet = "r\0" + from + "\0"+to+"\0" + channel + "\0" + message + "\0"+channelOfSender;
String[] tmp = to.Split(',');
_to = new String[tmp.Length];
for(int i = 0; i < _to.Length; i++)
_to[i] = tmp[i].Trim();

tokens = packet.Split('\0');
}


public InPrivateMessage(String packet) : base(packet)
{
if (tokens[0] != "r") throw new WrongPacketException("\n" + packet + "\nis not a private message");
String[] tmp = tokens[2].Split(',');
_to = new String[tmp.Length];
for(int i = 0; i < _to.Length; i++)
{
_to[i] = tmp[i].Trim();
}
}
public String message
{
get { return this[4]; }
set { this[4] = value; }
}
public String channel
{
get { return this[3]; }
set { this[3] = value; }
}
public String from
{
get { return this[1]; }
set { this[1] = value; }
}
private String[] _to;
public String[] to
{
get { return _to; }
set { _to = value;
string tmp="";
for(int i = 0; i < _to.Length; i++)
{
tmp += _to[i];
if(i!=(to.Length-1)) tmp+=',';
this[2] = tmp;
}
}
}
public String channelOfSender
{
get { return this[5]; }
set { this[5] = value; }
}

}


public class OutPrivateMessage : Packet
{
private OutPublicMessage e = null;
public OutPrivateMessage(String packet) : base(packet)
{
if (tokens[0] != "e") throw new WrongPacketException("\n" + packet + "\nis not a private message");
if (!tokens[2].StartsWith("/p ")) throw new WrongPacketException("\n" + packet + "\nis not a private message");
string tmp = tokens[2].Substring(2);
if(tmp.Split(':').Length <2) throw new WrongPacketException("\n" + packet + "\nis not a valid private message");
tmp = tmp.Split(':')[0].Trim();
string[] nicks = tmp.Split(',');
foreach(String nick in nicks)
{
if(nick.Trim()=="") throw new WrongPacketException("\n" + packet + "\nis not a valid private message");
}
e = new OutPublicMessage(this.packet);

}

public OutPrivateMessage(String to, String message, String channel)
{
_time = DateTime.Now;
e = new OutPublicMessage("/p " + to.Trim() + ":" + message, channel);
this.packet = e.packet;
this.tokens = e.packet.Split('\0');

}

public String[] to
{
get
{
string tmp = tokens[2].Substring(2);
return tmp.Split(':')[0].Split(',');
}
set
{
string tmp = "";
for (int i = 0; i < value.Length; i++)
{
tmp += value[0];
if (i != (to.Length - 1)) tmp += ',';



}

string message = this.message;
e.message = "/p " + tmp + ":" + message;
this.tokens = e.tokens;
this.rebuild();

}


}

public String message
{
get
{
string tmp = tokens[2].Substring(2);
return tmp.Split(':')[1].Trim();
}
set
{
string tmp = tokens[2].Substring(2);
string nicks = tmp.Split(':')[0].Trim();
string message = tmp.Split(':')[1].Trim();
message = value;
e.message = "/p "+nicks+":"+message;
this.tokens = e.tokens;
this.rebuild();
}
}
public String channel
{
get { return e.channel; }
set { e.channel = value; this.tokens = e.tokens; this.rebuild(); }
}


}
public class OutPublicMessage : Packet
{
public OutPublicMessage(String message, String channel)
{
_time = DateTime.Now;
packet = "e\0"+channel+"\0"+message;
tokens = packet.Split('\0');
}


public OutPublicMessage(String packet) : base(packet)
{
if(tokens[0] != "e") throw new WrongPacketException("\n"+packet+"\nis not a public message");
}

public String message
{
get { return this[2]; }
set { this[2] = value; }
}
public String channel
{
get { return this[1]; }
set { this[1] = value; }
}

}
public class OutMailMessage : Packet
{
public OutMailMessage(String receiver, String msg, String chan, bool sig) : this(receiver, "", msg, chan, sig) { }
public OutMailMessage(String receiver, String subj, String msg, String chan, bool sig)
{
this.packet = "post\0post\0Senden\0" + receiver + "\0" + subj + "\0" + (sig ? 1 : 0) + "\0" + msg;
tokens = packet.Split('\0');

}
public OutMailMessage(String msg)
{
String[] tmp = msg.Split('\0');
if (tmp[0] == "post")
{
if (tmp[1] != "post" || tmp[2] != "Senden") throw new WrongPacketException("\n" + msg + "\n is not a valid OutMailMessage");
if (tmp.Length != 7) throw new WrongPacketException("\n" + msg + "\nis not a valid OutMailMessage");
if (tmp[5] != "0" && tmp[5] != "1") throw new WrongPacketException("\n" + msg + "\n is not a valid OutMailMessage");
this.packet = "post\0post\0Senden\0" + tmp[3] + "\0" + tmp[4] + "\0" + tmp[5] + "\0" + tmp[6];
tokens = packet.Split('\0');

}
else if (tmp[0] == "e")
{
if (!tmp[2].StartsWith("/m ")) throw new WrongPacketException("\n" + packet + "\nis not a OutMailMessage");
string tmp2 = tokens[2].Substring(2);
if (tmp2.Split('0').Length < 2) throw new WrongPacketException("\n" + packet + "\nis not a valid OutMailMessage");
string nick = tmp2.Split(':')[0].Trim();
string mes = tmp2.Replace("nick", "").Trim();
string[] info = mes.Split('§');
string subj = "", mes2 = "";
if (info.Length > 1)
{
subj = info[0];
mes2 = mes.Replace(subj + "§", "");
}
else
mes2 = info[0];
this.packet = "post\0post\0Senden\0" + nick + "\0" + subj + "\01\0" + mes2;
tokens = packet.Split('\0');

}
else throw new WrongPacketException("\n" + msg + "\nis not a OutMailMessage");

}


public String to
{
set
{
this[3] = value;
}
get
{
return this[3];
}
}
public String subject
{
set
{
this[4] = value;
}
get
{
return this[4];
}
}
public String message
{
set
{
this[6] = value;
}
get
{
return this[6];
}
}
public bool signature
{
set
{
this[5] = (value ? 1 : 0).ToString();
}
get
{
return (this[5] == "1" ? true : false);
}

}


}
public class OutPingAnswer : Packet
{
private String _nick;
private Int64 _pingID;

public OutPingAnswer(String nick, Int64 pingID)
{
_time = DateTime.Now;
this._nick = nick;
this._pingID = pingID;
this.packet = "h\0" + nick + "|" + pingID;
this.tokens = packet.Split('\0');
}

public OutPingAnswer()
{
_time = DateTime.Now;
this._nick = null;
this._pingID = 0;
this.packet = "h\0-";
this.tokens = packet.Split('\0');

}
public OutPingAnswer(string msg)
: base(msg)
{
if (msg[0] != 'h') throw new WrongPacketException("\n" + msg + "\nis not a ping answer");
if (msg == "h\0-") { _nick = null; _pingID = 0; return; }
string[] info = this[1].Split('|');
if (info.Length != 2) throw new WrongPacketException("\n" + msg + "\nis not a valid ping answer");
_nick = info[0].Trim();
try { _pingID = Int64.Parse(info[1].Trim()); }
catch { throw new WrongPacketException("\n" + msg + "\nis not a valid ping answer"); }

}

public String nick
{
set
{
if (value == null)
{
_nick = null;
_pingID = 0;
this.packet = "h\0-";
}
else
{
_nick = value;
this.packet = "h\0" + _nick + "|" + _pingID;
}
this.tokens = packet.Split('\0');
}
get { return _nick; }
}
public Int64 pingID
{
set
{
if (_nick == null) _nick = "";
_pingID = value;
this.packet = "h\0" + _nick + "|" + _pingID;
this.tokens = packet.Split('\0');

}
get { return _pingID; }
}



}

}