Laden...

IRC Bot soll euf stichworte Reagieren

Erstellt von Bork vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.458 Views
B
Bork Themenstarter:in
18 Beiträge seit 2008
vor 16 Jahren
IRC Bot soll euf stichworte Reagieren

Hallo,

Ich bin gerade Dabei für mein Netzwerk zu Hause ein IRC Bot zu schreiben
der auf ein Stichwort reagiert wie z.B.

<Bork> time: bot_name_download http://./ServicePack***.exe

Dass der bot auf die zeichenkette bot_name_download reagiert und
eine Funktion mit dem Parameter X=http://./ServicePack***.exe das
übergibt.

Bis jetzt benutze ich nur die Standard API's die Netframework hergibt!

using System;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Security.Cryptography;

class IrcBot
{

    // Irc server to connect 
    public static string SERVER = "irc.df.lth.se";
    // Irc server's port (6667 is default port)
    private static int PORT = 6667;
    // User information defined in RFC 2812 (Internet Relay Chat: Client Protocol) is sent to irc server 
    private static string USER = "USER CSharpBot 8 * :I'm a C# irc bot";
    // Bot's nickname
    private static string NICK = "Client_"+RandomPassword.Generate(5, 6);
    // Channel to join
    private static string CHANNEL = "#my_channel";
    // StreamWriter is declared here so that PingSender can access it
    public static StreamWriter writer;


    static void Main(string[] args)
    {
        NetworkStream stream;
        TcpClient irc;
        string inputLine;
        StreamReader reader;
        string nickname;
        try
        {
            irc = new TcpClient(SERVER, PORT);
            stream = irc.GetStream();
            reader = new StreamReader(stream);
            writer = new StreamWriter(stream);
            // Start PingSender thread
            PingSender ping = new PingSender();
            ping.Start();
            writer.WriteLine(USER);
            writer.Flush();
            writer.WriteLine("NICK " + NICK);
            writer.Flush();
            writer.WriteLine("JOIN " + CHANNEL);
            writer.Flush();
            while (true)
            {
                while ((inputLine = reader.ReadLine()) != null)
                {
                    if (inputLine.EndsWith("JOIN :" + CHANNEL))
                    {
                        /* Hier Soll der Bot auf den Befehl werten
                         * 
                         */
                        


                    }
                }
                // Close all streams
                writer.Close();
                reader.Close();
                irc.Close();
            }
        }
        catch (Exception e)
        {
            // Show the exception, sleep for a while and try to establish a new connection to irc server
            Console.WriteLine(e.ToString());
            Thread.Sleep(5000);
            string[] argv = { };
            Main(argv);
        }
    } // ENDE MAIN
}

H
240 Beiträge seit 2006
vor 16 Jahren

Und was GENAU ist deine Frage?

MfG hulkstar

Gelöschter Account
vor 16 Jahren

ok. folgendes gibt es bei dem code zu beanstanden:

1.

catch (Exception e)
        {
            // Show the exception, sleep for a while and try to establish a new connection to irc server
            Console.WriteLine(e.ToString());
            Thread.Sleep(5000);
            string[] argv = { };
            Main(argv);
        }

Main(argv); -> Stackoverflowexception
wenn er keine verbindung bekommt versucht er rekrusiv jedesmal eine neue verbindung zu erstellen, solange bis der stack überläuft....

  1. Thread.Sleep(5000);
    nicht gut im mainthread....

  2. while (true)
    generell nicht gut da keinerlei abbruchbedingung vorhanden ist.

beachte:

while (true)
            {
                while ((inputLine = reader.ReadLine()) != null)
                {
                    if (inputLine.EndsWith("JOIN :" + CHANNEL))
                    {
                        /* Hier Soll der Bot auf den Befehl werten
                         *
                         */



                    }
                }
                // Close all streams
                writer.Close();
                reader.Close();
                irc.Close();
            }

am ende schließt du alles und springst wieder in die endlosschleife und versuchst wieder auf dem geclosten strem zu lesen...

4.

PingSender ping = new PingSender();
            ping.Start();

was ist das ? wozu? was macht das? wie lange macht er das?

5.

/* Hier Soll der Bot auf den Befehl werten
                         *
                         */

was für ein problem hast du hier?

generell: ich kann keine frage erkennen.

beachte bitte:
Wichtig: [Hinweis] Wie poste ich richtig?

undweitere links die dich interessieren könnten:
[FAQ] TcpClient einfaches Beispiel
[Artikel] Regex-Tutorial
[Artikel] Multi-Threaded Programmierung
[Tutorial] Client-/Server-Komponente über TCP-Sockets
Ping

3.971 Beiträge seit 2006
vor 16 Jahren

Und wo ist das Probelm oder Fehler (und die Fehlerbeschreibung)?

Edit: zu spät

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

B
Bork Themenstarter:in
18 Beiträge seit 2008
vor 16 Jahren

Ich finde leider keine API Dukumentation und kenne die Befehle nicht.
Die IRC Connection ist nicht von mir.
Werde sie aber verbessen THX@JAck30lena
Gefunden hab ich die Vorlage sie -Hier-

Wenn ihr ein Link mir zu der API Duku geben könntet wär das schon eine
riesen Hilfe. Oder den befehl wenn bot_name_download dann tuhe das.
Mehr brauche ich nicht für die funktion des Bot um einfach nicht
mehr mein arsch hochzubewegen zu meinen Clientrechnern um
service packs zu installieren^^.

Gelöschter Account
vor 16 Jahren

du bekommst einen string. das einzige was du tun musst, ist ihn zu parsen und in abhängigkeit davon zu handeln.

edit: hierzu wird dir das regex tutorial behilflich sein was ich dir bereits gepostet habe.

243 Beiträge seit 2005
vor 16 Jahren

Die while-Schleife ist wirklich ungünstig. Ich hantle gerade auch mit IRC rum, und das hat bei mir 50% CPU-Auslastung verursacht. Ein Thread.Sleep() in der Schleife löst zwar die Probleme ist aber nicht gerade sehr schön.
Versuche stattdessen die asynchronen Methoden von TcpClient.GetStream(): BeginRead() und BeginWrite().

Das IRC-Protokoll ist übrigens hier dokumentiert:

RFC 1459 (Urversion)
RFC 2812 (Neue Version; beschreibt Protokoll für die Clients)
RFC 2810 (Neue Version; beschreibt Architektur)
RFC 2811 (Neue Version; beschreibt Channels)
Client-to-Client-Protocol (und DCC)

B
Bork Themenstarter:in
18 Beiträge seit 2008
vor 16 Jahren

Ja geil THX