Erstmal vorweg: Ich brauche keine Zensur für den Code. Ich code einen Bot, er soll "nur" funktionieren, auch wenn Quick'n'Dirty! Ich kann nicht soviel Zeit in das Ding investieren. Er soll nur eine Seite "aufrecht" erhalten.
Nun zum Problem:
Für die Musik meiner Mitchatter entschuldige ich mich schonmal recht herzlich.
Also wie man sieht, liegt die CPU-Usage des Bots bei 99%! Das rührt daher, dass ich eine "Endlos"schleife habe, die ewig prüft, ob Daten auf dem Socket bereitliegen die ausgelesen werden sollen.
Auch ein "TcpClient.Client.Blocking = true;" ändert da nichts dran.
Also wenn jemand eine Idee hätte wie ich das lösen kann - Immer her damit.
Ein weiteres Problem ist übrigens, dass der Bot auch unter Linux laufen muss. OK, das ist ansich schon ein Problem

, aber ein weiteres ist, das Mono anscheinend eher zu net 1.1 als 2.0 kompatibel ist, denn die Property "Client" von "TcpClient" ist dort noch protected, das heisst ich kann gar nicht auf diese zugreifen(erst ab 2.0). Eine Klasse von TcpClient möchte ich nicht ableiten.
Also wenn jemand eine Alternative dazu hat, möge er sie bitte nennen.
Hier ist übrigens der Code:
Code:
using System; using System.Collections; using System.Text; using System.Net.Sockets; using System.IO; namespace iSM
{
classProgram
{
structEventUser
{
internalstring Nickname;
internalstring Username;
internalstring Hostname;
}
staticvoid Main(string[] args)
{
conststring BNICK = "iSM";
conststring BPASSWD = "pwd";
conststring BCHAN = "#night";
TcpClient tcpClient = newTcpClient();
string sMainBuf = "";
tcpClient.Client.Blocking = true;
tcpClient.Connect("irc.ham.de.euirc.net", 6667);
SendText(ref tcpClient, "USER fick dich ins :knie");
SendText(ref tcpClient, "NICK " + BNICK);
while (tcpClient.Connected) // HIER DIE ENDLOSSCHLEIFE
{
byte[] baBuffer = newbyte[512];
string sRawCmd, sPrefix, sCmd, sParams;
EventUser User;
if (tcpClient.GetStream().DataAvailable)
{
sMainBuf += ASCIIEncoding.Default.GetString(baBuffer, 0, tcpClient.GetStream().Read(baBuffer, 0, 512));
sMainBuf = sMainBuf.Replace("\r", "\n");
sMainBuf = sMainBuf.Replace("\n\n", "\n");
while (sMainBuf.IndexOf('\n') > -1)
{
sRawCmd = sMainBuf.Substring(0, sMainBuf.IndexOf('\n'));
sMainBuf = sMainBuf.Remove(0, sMainBuf.IndexOf('\n') + 1);
System.Console.WriteLine(sRawCmd);
if (sRawCmd.Length > 0)
{
User.Nickname = "";
if (sRawCmd[0] == ':')
{
sPrefix = sRawCmd.Substring(1, sRawCmd.IndexOf(' '));
sRawCmd = sRawCmd.Remove(0, sRawCmd.IndexOf(' ') + 1);
int iHostPrePos = sPrefix.IndexOf('@');
if (iHostPrePos > -1)
{
User.Hostname = sPrefix.Substring(iHostPrePos, sPrefix.Length - iHostPrePos);
sPrefix = sPrefix.Remove(iHostPrePos, sPrefix.Length - iHostPrePos);
}
int iUserPrePos = sPrefix.IndexOf('!');
if (iUserPrePos > -1)
{
User.Username = sPrefix.Substring(iUserPrePos, sPrefix.Length - iUserPrePos);
sPrefix = sPrefix.Remove(iUserPrePos, sPrefix.Length - iUserPrePos);
}
User.Nickname = sPrefix;
}
sCmd = sRawCmd.Substring(0, sRawCmd.IndexOf(' '));
sParams = sRawCmd.Remove(0, sRawCmd.IndexOf(' ') + 1);
ArrayList salParams = newArrayList();
while (sParams != "")
{
if (sParams[0] == ':')
{
salParams.Add(sParams.Substring(1, sParams.Length - 1));
sParams = "";
}
elseif (sParams.IndexOf(' ') > -1)
{
salParams.Add(sParams.Substring(0, sParams.IndexOf(' ')));
sParams = sParams.Remove(0, sParams.IndexOf(' ') + 1);
}
else
{
salParams.Add(sParams);
sParams = "";
}
}
switch (sCmd)
{
case"PING":
SendText(ref tcpClient, "PONG :" + salParams[0].ToString());
break;
case"KICK":
if (salParams[1].ToString() == BNICK)
{
SendText(ref tcpClient, "JOIN " + BCHAN);
}
break;
case"NOTICE":
if ((User.Nickname == "NickServ") && (salParams[1].ToString() == "please choose a different nick."))
{
SendText(ref tcpClient, "PRIVMSG NickServ :identify " + BPASSWD);
SendText(ref tcpClient, "JOIN " + BCHAN);
}
break;
case"474": // Chan is banned
SendText(ref tcpClient, "PRIVMSG ChanServ :unban " + BCHAN);
SendText(ref tcpClient, "JOIN " + BCHAN);
break;
}
}
}
}
}
}
staticvoid SendText(refTcpClient tcpClient, string Text)
{
if (tcpClient != null)
{
byte[] baBuffer = newbyte[512];
Text += "\r\n";
int iBufSize = ASCIIEncoding.Default.GetBytes(Text, 0, Text.Length, baBuffer, 0);
tcpClient.GetStream().Write(baBuffer, 0, iBufSize);
}
}
}
}
MfG