c# SmartIrc4net Problem

06/04/2013 21:05 G-Mac_x3#1
Guten Tag,

ich bin grade dabei ein kleines Programm mit integriertem IRC Client zu schreiben. Allerdings macht die Lib (SmartIrc4net) einige Problem.. erstmal der Code:
Code:
public void OnQueryMessage(Data ircdata)
        {
            requested_channel = ircdata.MessageEx[1];
            channel = irc.GetChannel(requested_channel);
            switch (ircdata.MessageEx[0]) {
                case "join":
                    irc.Join(ircdata.MessageEx[1]);
                break;
                case "part":
                    irc.Part(ircdata.MessageEx[1]);
                break;
                case "say":
                irc.Message(SendType.Message, ircdata.MessageEx[1], ircdata.MessageEx[2]);
                break;
            }
        }
        public void IRCfunction(string text)
        {
            irc.SendDelay = 200;
            irc.AutoRetry = true;
            irc.ChannelSyncing = true;
            irc.OnQueryMessage += new MessageEventHandler(OnQueryMessage);

            string[] serverlist;
            serverlist = new string[] {"irc.echo-net.eu"};

            int    port   = 6667;
            if (irclogin == false)
            {
                if (irc.Connect(serverlist, port) == true)
                {
                    irc.Login(username, "FWM Tool User");
                    irc.Join("#fwm");
                    
                    irclogin = true;
                    //irc.Message(SendType.Message, "#fwm", text);
                }
                else
                {
                    MessageBox.Show("couldn't connect!");
                }
            }
            else
            {
               
               
            }
            thread = new Thread(ReadCommands);
            thread.Start();

            thread.Join();
            irc.Listen();
        }

        private void ReadCommands()
        {
            while (true)
            {
                string cmd = irc_input.Text;
                irc.Message(SendType.Message, "#fwm", cmd);
                irc.Listen();
            }
        }
Das Problem ist das er die Message nur absendet wenn ein irc.Listen(); im Thread ist allerdings dann das Programm sofort hängt. Außerdem ist aus der Dokumentation der Lib nicht ersichtlich mit welcher Funktion man den IRC Chat verlauf auslesen kann?
Ich bin selber Anfänger in C# und finde daher trotz stundenlangen Googelns keine Lösung.

Hoffe nur das sich hier jemand findet der mir bei dem Problem helfen könnte.

MfG
06/04/2013 21:32 Hiris#2
short iq = 100
if( you_think_shit_is_the_same(c++,c#) )
{
iq = -iq;
}
06/04/2013 21:36 Schlüsselbein#3
Erstmal falsche Section.

Ich kenne die Lib nicht, aber kurzes Googeln bringt mich mal auf folgenden spontanen Trichter:
Direkt auf erster Seite steht folgendes:
Quote:
Simple event driven IRC library to allow easy development of IRC aware applications under the .NET framework
Daraus folgere ich mal: Du schreibst entsprechende Methoden für senden, empfangen etc., registrierst diese für die Events und rufst dann _einmalig_ irc.Listen() auf (was dann wahrscheinlich die Mainloop ist, von welcher die Events abgearbeitet werden usw.).

Wie gesagt, einfach nur ins Blaue hinein geraten. Wäre schön, wenns jemand (der Erfahrung mit der Lib hat) bestätigen bzw. widerlegen würde.
06/04/2013 21:46 G-Mac_x3#4
Quote:
Originally Posted by Hiris View Post
short iq = 100
if( you_think_shit_is_the_same(c++,c#) )
{
iq = -iq;
}
Jeder kann sich mal in der Sektion verlesen.Ich weiß das es nicht das gleiche ist. Also lass doch bitte so sinnlose Kommentare.

Danke Schlüsselbein, so habe ich mir das eigentlich auch gedacht allerdings habe ich durch Tests raus bekommen das wenn ich irc.Message(inhalt); nutzen direkt danach irc.Listen nutzen muss, sonst sendet er die Message nicht.

Aber schonmal danke ;)

MfG
06/04/2013 21:48 Schlüsselbein#5
Ich glaube eher, dass du irc.Listen() nur einmal(!) aufrufen musst. Wie gesagt, kann ich mich irren (habe nichtmal in die Docs geschaut). Setz mal n Breakpoint nach irc.Listen() und schau ob die Methode returnt.
06/04/2013 22:24 Padmak#6
Ich glaube, es sieht so aus:
Code:
irc.Message("bla");
while(irc.Listen())
{
    Sleep(10);
}
Also intern zumindest

Padmak
06/04/2013 22:28 xxfabbelxx#7
moved
06/04/2013 22:31 Schlüsselbein#8
Kurze Verbesserung: Ich hab mich vertran (irc4net statt SmartIrc4net). Deswegen erstmal alle Antworten alten Antworten von mir ignorieren.

Edit: Hatte doch recht. Jungs, ein wenig die Doku und Exmaples lesen hilft.
[Only registered and activated users can see links. Click Here To Register...]

Zuerst werden die Methoden geschrieben, dann regisitriert:
Code:
        // here we connect the events of the API to our written methods
        // most have own event handler types, because they ship different data
        irc.OnQueryMessage += new IrcEventHandler(OnQueryMessage);
        irc.OnError += new ErrorEventHandler(OnError);
        irc.OnRawMessage += new IrcEventHandler(OnRawMessage);
Und zuletzt wird in die Loop gesprungen, die sich um die Events kümmert:
Code:
            // here we tell the IRC API to go into a receive mode, all events
            // will be triggered by _this_ thread (main thread in this case)
            // Listen() blocks by default, you can also use ListenOnce() if you
            // need that does one IRC operation and then returns, so you need then 
            // an own loop 
            irc.Listen();
Falls du nun ne GUI-Anwendung schreibst (lasse das erstmal, mache dich erstmal in der Konsole mit dem Framework vertraut), musst du (wie man oben lesen kann), irc.ListenOnce() benutzen (was dann wohl jeweils nur einmal die Loop durchläuft).


//Edit2: Beim TS fehlt es wohl am grundlegenden Verständnis, habe mir gerade eben nochmal den Code oben angeschaut.
Erstmal (nochmal): Lern, Dokumentationen zu lesen und zu vestehen. Das ist das A und O beim Nutzen fremder Libs.
2. Mach dir klar, wie dein Programm funktioniert. Wie funktioniert eine Konsolenanwendung, wie eine GUI-Anwendung? Wie werden die Events in einer GUI-Anwendung bearbeitet? Was ist eine "Mainloop"? Warum ist diese bei einer GUI-Anwendung notwendig? Warum bei dieser Netzwerklib? Was für ein Problem gibts beim Nutzen einer GUI-Anwendung und der Lib? Wie lässt es sich beheben?

Wenn du dir zu den Fragen die Antworten erarbeitest, wirst du die Lib ohne Probleme benutzen können (sowohl in GUI, als auch in Konsole).

//Edit3: Bei Möglichkeit vielleicht doch nochmal bei den Grundlagen beginnen. Dein Code ist ne Zumutung (bis auf den Teil, den du aus dem Beispiel kopiert hast).
06/06/2013 16:57 G-Mac_x3#9
Erstmal danke. Und das der Code schrecklich ist weiß ich. Bin selber noch C# Anfänger habe vorher allerdings bereits viel mit php, java, js gearbeitet, weshalb mir der Umgang mit Libs/Plugins/Addons nicht unbekannt ist. Ich bedanke mich bei dir Schlüsselbein, habe mich dazu entschieden erst mal die anderen Punkte abzuarbeiten und mich dann später um den kleinen IRC Client zu kümmern. Habs mittlerweile halb hinbekommen, nachdem ich gemerkt habe das ich eine ältere Version der Lib hatte also in dem Beispiel auf github zu finden ist.

Nunja ich bedanke mich nochmals.

MfG