TIRC, IRC Modul, superleicht!

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Hummelpups

Betreff: TIRC, IRC Modul, superleicht!

BeitragMi, Jul 05, 2006 23:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Community,

und noch ein großes Topic von mir, man, viel zu schreiben bevor
ich ab morgen flash liege ^^.

Es geht um ein IRC Modul, welches ich seit gestern programmiere und schon
super läuft. Ich habe hier mal einen TestSource geschrieben um euch
zu zeigen, wie leicht IRC Connections mit diesem Modul sind.

Code: [AUSKLAPPEN]
Strict

'Importiert das Modul
Import iud.tirc

Graphics 800,600,0,60


Local chatbuffer:String         'Temporäre speicherung der Input Routine
Local msg_buffer:String[1024]      'Der MsgBuffer, der angezeigt wird und mit dem Buffer des Moduls
                           'abgeglichen wird
Local steps:Int
Global last_chat:String
Global chat:String

Local stream:TIRCStream=New TIRCStream
stream.ConnectTo("irc.blitzed.org","DeinName")
stream.WaitUntilConnected         'Wartet bis wirklich zum Netzwerk connected wurde
                           'In dieser Methode ist eine Schleife, es hält also das
                           'Programm an, es gibt aber ein Workaround dafür

Stream.JoinChannel("#wayne")      'Joint einem Channel
'Stream.SetActiveChannel("#wayne")   'Diese Methode ist nur bei mehreren Channels nötig
                           'Mit SetActiveChannel wird ausgewählt, wo die Kicks,
                           'Die Modeanweisungen, die Parts und alle anderen Aktionen
                           'gehen.

Repeat
   Cls
      stream.do()               'Fragt das Netzwerk ab, fügt User hinzu, löscht sie
                           'Und antwortet - wenn eingestellt, std.: ja - auf Pings
                  
      msg_buffer=stream.getmessagebuffer()   'Fragt den Buffer der Session ab, er ist auf
                                    '1024 Zeilen begrenzt.
      
      'Standardanzeige zum testen
      For steps=0 To 40
         DrawText msg_buffer[steps],5,500-steps*15
      Next
      
      
      'Chat
      if InputRoutine()=1 then Stream.SendChatMsg(chat) ; chat=""
      drawtext chat,5,550

   Flip
Until KeyHit(key_escape)

stream.SetQuitMsg("Byebye")         'Setzt die Quit Msg, kann auch am Anfang gesetzt werden
stream.Quit                     'Beendet die IRC Sitzung
stream.Free                     'Schließt TCP Stream, löscht eigene Instanz




Function InputRoutine:byte()
   Local input_key=GetChar()
   Local return_value:String
   
   If input_key Then
      If input_key=13 Then
         return 1
         last_chat=chat
      Else If input_key=8
         If Len(chat)>0 Then chat=Left(chat,Len(chat)-1)
      Else If input_key>=32 And input_key<127
         chat=chat+Chr(input_key)
      EndIf
   EndIf
   
   return 0
End Function


Im Modul sind natürlich noch mehr Methoden und Funktionen enthalten.
Sie sind nicht alle dokumentiert, hab heute echt keine Zeit mehr gehabt.
Mach ich später mal.

Ist natürlich auch schon auf unserem Portal Modulserver.
Scope: iud

IMurDOOM
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus
  • Zuletzt bearbeitet von Hummelpups am Sa, März 03, 2007 15:21, insgesamt einmal bearbeitet
 

Ticha

BeitragMi, Feb 07, 2007 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
hey cool, genau das was ich suche. Nur irgendwie funtioniert der Link zu dem Modul nimmer Sad

Hummelpups

BeitragMi, Feb 07, 2007 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo soll es auch nicht.

Es soll umstrukturiert werden...irgendwann.
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus
 

Ticha

BeitragMi, Feb 07, 2007 21:26
Antworten mit Zitat
Benutzer-Profile anzeigen
schade, so was hätt ich gebraucht Crying or Very sad

Hummelpups

BeitragMo, Feb 26, 2007 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Bin gerade am umstrukturieren, bald ist die nächste sehr gut funktionierende
Version fertitsch.

Wer hat denn noch Interesse an diesem Modul außer Ticha???

IMurDOOM
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

Wild-Storm

BeitragMo, Feb 26, 2007 15:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich werde zwar sicherlich jetzt keinen IRC Clienten schreiben (oder doch? XD) aber ich fände es sehr interessant mal hinter die Kulissen von IRC zu blicken und zu sehen, wie das ganze funktioniert! Vorallem da ich im Thema Netzwerk nicht so der Pro bin...
Visit http://www.next-dimension.org
-------------------------------------------------
Freeware Modelle, Texturen & Sounds:
http://www.blitzforum.de/forum...hp?t=12875

Hummelpups

BeitragMi, Feb 28, 2007 1:49
Antworten mit Zitat
Benutzer-Profile anzeigen
So, hier mal der kleinste ConsoleIRCClient den ich kreiren konnte.
Leider mit dem üblichen problem das bei Eingaben das Programm
angehalten wird.
Darum gehts aber auch nicht sondern eher wie leicht es ist zu nem
Server zu connecten.

Code: [AUSKLAPPEN]
Import iud.tirc
Global stream:TIRCStream=New TIRCStream
stream.ConnectTo("localhost","TestName",6667)
stream.WaitUntilReady;stream.JoinChannel("#ch1");
Local msg:String;Repeat;stream.do;
For msg=EachIn stream.GetNewMessageBuffer()
Print msg;Next;msg=Input(">");stream.SendChatMsg(msg)
Until msg.toupper()="QUIT";stream.quit;End


Es werden bisher erkannt:
- JOIN
- PART
- NICK
- Topics
- Nicklists
- OP,Voice, was auch immer bei Changründung
- LIST
- Diverse Zahlencodes

Was noch ansteht:
- DCC vielleicht
- Private Messages
- Chan Modes
- Usermodes

IMurDOOM
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

BtbN

BeitragMi, Feb 28, 2007 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Man kann übrigens per select abfragen, ob was von der StdIn zu lesen ist.


Edit:

Mal ein beispiel, wie ich das meine:

Code: [AUSKLAPPEN]
While True
   Local n:Int = 0
   If select_(1,Varptr _n,0,Null,0,Null,0) Then
      Print "New!"
      Local s:String = Input("")
      If s = "end" Then End
      Print s
   EndIf
   Print "Still running..."
   Delay(100)
Wend

Hummelpups

BeitragMi, Feb 28, 2007 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktioniert bei mir nicht so wie es vielleicht funktionieren sollte.
Kann das noch nen win(ner) hier bestätigen?

Bei mir bleibt er immer beim "New" hängen.

IMurDOOM
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

Artemis

BeitragDo, März 01, 2007 9:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo, stoppt nach New!

Hummelpups

BeitragDo, März 01, 2007 9:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, dann scheint sich die Win Console ja nicht so weit austriksen zu
lassen das es geht Wink

BtbN meint es funzt auf Mac OS und Lin.

Naja, war ja auch nur so zur anschauung wie kurz es sein kann, es aber natürlich
nicht wird ;D

IMurDOOM
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus
 

Dreamora

BeitragDo, März 01, 2007 16:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Das funktioniert auch unter Windows.
Aber Input ist ein blocking call. Solange du kein Enter gedrückt hast wird auch nix passieren. darum erscheint der rest nicht.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

BtbN

BeitragDo, März 01, 2007 16:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Auf Linux funktioniert es in dem sinne, dass es nicht blockiert.
Auf Windows ist dies mit select nicht möglich, da dieses dort ausschließlich für WinSock zuständig ist. Wenn ichs der MSDN richtig entnehme, ginge es auf Windows mit folgender C-Funktion:

Code: [AUSKLAPPEN]
int stdInAct_(int millis)
{
    WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE),millis);
}


Könnte das wohl wer testen?

Farbfinsternis

BeitragDo, März 01, 2007 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Wozu das Input-Objekt austricksen? Es gibt andere Möglichkeiten eine asynchrone Eingabe-Routine zu entwickeln.

Zudem hat das ganze Modul noch einige Schwachpunkte, da müsste dringend mal extrem aufgeräumt werden. Der Anfang ist sicher nicht schlecht, aber der Code könnte noch extrem reduziert werden. Da ich hier gerade für ein Unternehmen eine Netzinterne Chat-Lösung programmieren soll, kam mir das Modul gerade recht, da ein Linux-Server mit installiertem IRC Server zur Verfügung steht. Aber die Haken und Ösen in dem Modul haben mich dann doch dazu gezwungen auf Vertex' BnetEx auszuweichen und ein eigenes Protokoll auf UDP aufzusetzen.

Ich will auf keinen Fall die hier geleistete Arbeit abwerten, nur wirklich benutzbar ist das Modul derzeit noch nicht. Ich wünsche aber viel Erfolg beim weiterentwickeln dieser großartigen Idee.
Farbfinsternis.tv

Hummelpups

BeitragDo, März 01, 2007 23:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, tut mir leid Sad Das Modul ist VOLLKOMMEN neu aufgesetzt worden.
Der Status in dem es sich befindet steht in keiner Relation zu dem, was
es nun schon kann.

Habe den neusten Code nur noch nicht hochgeladen.

Es wäre natürlich nett wenn du mir deine Haken und Ösen nennen
würdest!

Wenn du darauf anspielst, das man bei dem momentanen Modul einfach
QUIT als msg eingeben kann und der Client denkt jemand quittet
ist längst behoben, solche Bugs können nicht mehr benutzt werden.

Es wird längst nicht mehr nur nach einen keyword gesucht sondern nach
spezifischen zeichenketten, also eine perfekte kombination aus UserNickname,
Keyword, channel, was auch immer.

Vielleicht kannst du es doch benutzen!

Desweiteren nutzt TIRC BNetEx Wink Wenn du wirklich konstruktive Vorschläge
hast, dann poste sie doch bitte, dann kann ich dir sagen ob die "Sicherheitslücken"
oder andere Lücken bereits gefixt worden sind Smile Außerdem möchte
ich BRL.Retro auch komplett verbannen, wird auch demnächst geschehen.

Es kann ja aber auch sein das du einfach nicht interessiert bist an jemanden
der nach Shadern für BMax ruft aber gerade mal den Print Befehl verstanden
hat. DAS verstehe ich als "runtermachen" !!!! Nur mal so Wink
(Vielleicht erinnerst du dich ja noch!)

IMurDOOM
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

Freeman

BeitragSa, März 03, 2007 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
wollt eigetnlich dein modul testen, doch leider muss ich feststellen das du es gar nicht hochgeladen hast. schade schade.

Fr3eMaN
MacBook | MacOSX 10.5 | 80GB HDD | 1GB | BlitzMax 1.28

Hummelpups

BeitragSa, März 03, 2007 15:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie gestern schon gesagt ist eine alte version auf dem Blitzhelp Modserver.

Ich kann natürlich mal die neue Version hochladen, dann muss ich sie aber
noch ein wenig dokumentieren. Eigentlich wollte ich den Source nicht mehr
freigeben bis soweit die normalen Dinge funktionieren aber is egal Razz

Hier:
Das aktuelle Modul, weiterhin noch nichts aufgeräumt, aber ein wenig sicherer
gemacht, brl.retro wird noch ausgebaut.
www.blitzhelp.net/tmp/tirc-1.46.rar

Und hier mal nen Beispiel:
www.blitzhelp.net/tmp/tirc_ex.rar

Feedback wie immer willkommen aber bitte beachtet, das ich noch nichts
aufgeräumt hab und es vorerst um die funktionalität geht Wink

IMurDOOM
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

Hummelpups

BeitragSo, Jul 29, 2007 5:14
Antworten mit Zitat
Benutzer-Profile anzeigen
So, alles komplett neu gemacht und funktioniert einwandfrei!

Neuste Version gibs hier zum Download, Sample und Source ist auch mit
dabei. Probierts aus und verwendet es.

Code: [AUSKLAPPEN]
Framework    brl.standardio
Import      brl.win32maxgui
Import       brl.graphics
Import       brl.max2d
Import      brl.glmax2d
Import      brl.blitz
Import      brl.timer

Import       iud.tirc

Strict
SetGraphicsDriver GLMax2DDriver()
AppTitle="BMXIRC Module Test"
Graphics 800,600,0,60
SetClsColor 255,255,255
Cls
SetColor 0,0,0
Include "init.bmx"

While Not KeyHit(key_escape)
   Cls
      WaitTimer(timer)
      
      lc=input_routine()
      If lc<>"" Then parse_lc(lc)
      
      msg_buffer=stream.GetMessageBuffer()
      
      DrawText stream.ready(),2,2
      
      If KeyHit(key_5) Then
         Local tmp_channel:TIRCChannel
         Local tmp_user:TIRCUser
         
         For tmp_channel=EachIn stream.GetChannellist()
            Print ">"+tmp_channel.name+"<"
            For tmp_user=EachIn tmp_channel.Userlist
               Print "- "+tmp_user.status+" "+tmp_user.Nickname
            Next
         Next
      End If
      
      'ZEICHNEN
      DrawText input_chat+"_",2,580
      msg_show(40)
      
      Local tmp_y=0
      Local tmp_user:TIRCUser
      DrawText "("+stream.ActiveChannel+")",600,85
      If stream.GetUserList()<>Null Then
         For tmp_user=EachIn stream.GetUserlist()
            DrawText tmp_user.nickname+" ("+tmp_user.status+")",600,100+tmp_y
            tmp_y:+10
         Next
      End If
      
      stream.do
   Flip   
Wend

Function INPUT_ROUTINE:String()
   Local Input_key=GetChar()
   
   If Input_key Then
      If Input_key=13 Then
         Input_chat_before=input_chat

         If Chr(input_chat[0])="/" Then
            Return input_chat[1..]
         ElseIf(Chr(input_chat[0])="*")
            stream.SendChatMsg(input_chat[1..])
            Input_chat=""
         Else
            stream.SendString(input_chat)
            Input_chat=""
         End If
      
      Else If Input_key=8
         If Len(Input_chat) > 0 Then Input_chat=Input_chat[..(Len(Input_Chat)-1)]
      Else If Input_key>=32 And Input_key<127
         Input_chat=Input_chat+Chr(Input_key)
      EndIf
   EndIf
   
   Return ""
End Function

Function MSG_SHOW(lines:Short)
   Local steps:Int
   
   For steps=0 To 1023
      If 550-steps*15+offset_y>=-15 And 550-steps*15+offset_y<=615 Then
         DrawText msg_buffer[steps],2+offset_x,550-steps*15+offset_y
      End If
   Next
End Function

Function parse_lc(txt:String)
   txt=txt+" "
   Local command:String
   Local paras:String
   
   command=txt[..txt.find(" ")].toupper()
   paras=txt[txt.find(" ")+1..]
   paras=paras.trim()
   
   Select command
   Case "J"
      stream.JoinChannel(paras)
   
   Case "A"
      stream.SetActiveChannel(paras)

   Case "JOIN"
      stream.JoinChannel(paras)

   Case "PART"
      stream.LeaveChannel()

   Case "P"
      stream.LeaveChannel()
      
   Case "CLS"
      Local steps:Int
      For steps=0 To 1023
         msg_buffer[steps]=""
      Next

   End Select
   
   input_chat=""
End Function

OnEnd terminate
Function terminate()
   stream.SetQuitMsg("Und tschoe")
   stream.Quit
End Function


Viel Spaß damit!

IMurDOOM
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group