[VB.NET] IRC Name und Nachricht

11/24/2014 16:55 eRazor97#1
Hey,
Ich versuche einen simplen Twitch bot in VB für einen Freund zu schreiben.
Ich würde gerne den Usernamen und die geschriebene Nachricht rausziehen und auf bestimmte Keywords überprüfen.

Wie löse ich das am besten.

MfG.
eRazor

//EDIT

Problem gelöst anderes aufgetaucht siehe seite 3 im Thread
11/24/2014 16:59 Mostey#2
[Only registered and activated users can see links. Click Here To Register...]

Schau doch erstmal dort, vielleicht hat Twitch sowas schon in der API abgedeckt.
11/24/2014 17:25 eRazor97#3
Die Twitch-IRC Dokumentation ist nichts beinhaltet was mir bei meinem Problem weiterhelfen könnte
11/24/2014 20:01 Mostey#4
Dann such dir den Server raus und verbinde dich eben damit. IRC ist kein komplexes Protokoll. Ansonsten gibt es fertige Libraries, siehe hier: [Only registered and activated users can see links. Click Here To Register...]
11/24/2014 20:41 eRazor97#5
Verbunden und sowas habe ich ja schon.
Meine Frage war wie ich das empfangene "außeinaner rupfen" kann.
So das ich den Namen vom Sender sowie die Nachricht zwischenspeichern kann um Befehle wie !vote z.B. reinmachen kann.
11/24/2014 21:49 Mostey#6
Was ist daran so komplex? Werde doch mal etwas konkreter.

Wenn du die Nachrichten und User empfangen kannst, pack sie doch in eine Liste und gehe diese Liste dann durch und prüfe den Inhalt der Nachricht (mittels RegEx oder so) auf ein !vote <irgendwas>.
11/25/2014 12:09 eRazor97#7
Und da liegt meine Frage :D
Wie ziehe ich die empfangene Nachricht raus?
11/25/2014 12:15 Devsome#8
Vielleicht hilft dir das weiter:
[Only registered and activated users can see links. Click Here To Register...]

Function recv()
und dann wie Mostey sagte, einfach die komplette Nachricht splitten,regex wie auch immer du das magst
11/25/2014 13:02 Mostey#9
Quote:
Originally Posted by eRazor97 View Post
Und da liegt meine Frage :D
Wie ziehe ich die empfangene Nachricht raus?
Ich bezweifle das du überhaupt ne Verbindung aufgebaut hast wenn du schon so eine Frage stellst.

Nachdem du einem Channel beigetreten bist, werden die Nachrichten der User über Broadcasts verschickt - jeder sieht die Nachricht und weiß von welchem User diese stammt.

Da IRC Server generell unterschiedlichen Output liefern kann man dir nicht sagen wie genau du hier die Nachricht rausziehst aber Devsome hat dir mit RegEx schon einen relativ guten Ansatz (wenn nicht sogar der beste) geliefert.

[Only registered and activated users can see links. Click Here To Register...]

Schau mal dort, da sind alle Befehle mit Beispielen dokumentiert.

PS: IRC läuft über Port 194 TCP, da musst du halt ein Socket aufmachen und manuell den JOIN Befehl absetzen. Wobei du selbst das nicht einmal tun müsstest, wenn du die Library nutzt.
11/25/2014 13:09 dowhile#10
Hier kannst du nachlesen, wie die Nachrichten aufgebaut sind: [Only registered and activated users can see links. Click Here To Register...]

Eine IRC Nachricht kann einen Präfix haben, muss aber nicht. Im Präfix findest du Informationen über den Nutzer, der die Nachricht abgesendet hat, oder den die Nachricht betrifft. Der Präfix besteht aus folgenden Teilen, wobei nur der nick Teil vorhanden sein muss (wenn es den Präfix gibt):

:nick!user@host[Leerzeichen]

Gültige Präfixe wären zum Beispiel :dowhile!daniel@localhost, aber auch nur :dowhile oder :dowhile!daniel oder :dowhile@localhost oder einfach gar kein Präfix.
Wenn es einen Präfix gibt, endet er aber immer mit einem Leerzeichen.

Anschließend kommt der Befehl, das ist zum Beispiel PRIVMSG für Nachrichten in Channels (oder User zu User), QUIT, JOIN, PART, TOPIC, MODE usw.
Nach dem Befehl kommen Parameter, die alle mit einem Leerzeichen getrennt werden. Es müssen aber keine kommen. Ganz am Ende kann ein langer Parameter mit Leerzeichen kommen, der dann mit [Leerzeichen]: beginnt. Zum Beispiel sind folgendes Nachrichten (von der Syntax her korrekt, keine Ahnung ob sie auch semantisch korrekt sind):

:dowhile!daniel@localhost PRIVMSG #101 :Hallo Welt!
Nick: dowhile
User: daniel
Host: localhost
Command: PRIVMSG
Parameter 1: #101
Parameter 2: Hallo Welt!

QUIT
Nick, User, Host: nicht vorhanden
Command: QUIT

CMDXYZ param1 param2 param3 :ganz langer param mit Leerzeichen

usw.

Wenn dich also nur Nachrichten interessieren, die Leute in den Channels schreiben, musst du nur IRC Nachrichten mit dem Befehl "PRIVMSG" betrachten. Schreibe dir also einen Algorithmus, der den Befehl in einer IRC Nachricht ermittelt. Anschließend kannst du im Präfix Informationen über den Absender der Nachricht finden und als ersten Parameter, glaube ich, den Channel, in dem die Nachricht geschrieben wird. Als letzten, langen Parameter hast du dann die Nachricht.

Wie genau du das machst, ist ja egal. Habe ich dir damit geholfen, oder brauchst du eher Hilfe dabei, wie du so einen Algorithmus nun realisierst, der das für dich Interessante aus der Nachricht rausholt (den du, wie von anderen gesagt, am einfachsten natürlich mit regexp machen könntest)?
11/25/2014 15:58 eRazor97#11
Danke @Devsome der eintrag von Marks Blog hat mir so einiges erleichtert.
Jetzt werde ich mal schauen wie regex aufgebaut ist.
Und auch vielen Dank an alle anderen :)

//EDIT:
Ich ziehe mir nun die Nachricht raus aber habe jetzt das problem, dass wenn ich !test eingebe der kein Output kommt.

Code:
If String.Compare(rmsg, "!test") = 0 Then
    send("PRIVMSG #einchannel: Warum testest du mich " & rnick & "?")
    cout.Write(rnick & " executed !test" & vbNewLine)
End If
was mache ich falsch?
11/25/2014 21:06 dowhile#12
Lass dir rmsg ausgeben und schau, wieso es ungleich !test ist.
11/25/2014 21:08 eRazor97#13
Lasse ich schon eine zeile weiter oben
Code:
mail = "msg: " & rnick & ">" & rmsg
[Only registered and activated users can see links. Click Here To Register...]
11/26/2014 10:20 Devsome#14
Vielleicht wird wenn ENTER gedrück wird zum absenden das "ENTER" zeichen auch noch mit gesendet, daher müsstest du das "Packet" sag ich mal trozdem noch splitten oder wie du es magst, dass du nur reinen text hast.
11/26/2014 11:51 eRazor97#15
Und wie genau soll ich das machen?
Mit Packets kenne ich mich null aus :S