Seite 1 von 2

IRC Client für PB 4

Verfasst: 19.09.2007 10:58
von DerProgrammierer78
Habe den Code hier im Forum nun auf PB 4 umgeschrieben ...

Code: Alles auswählen

InitNetwork()

Global ConnectionID.l


EnableExplicit 

Global NewList RecText.s()

DisableExplicit

Procedure IRCConnect(Server.s, Port.l)
  Connection = OpenNetworkConnection(Server, Port)
  If Connection <> 0
    ConnectionID = Connection
  EndIf
  ProcedureReturn Connection
EndProcedure

Procedure IRCUseConnection(Connection)
  ConnectionID = Connection
EndProcedure

Procedure IRCLogin(Server.s, Name.s, Pass.s)
  SendNetworkString(ConnectionID,"USER "+ReplaceString(Name, " ", "_")+" localhost "+Server+" http://www.bradan.net/"+Chr(13)+Chr(10))
  SendNetworkString(ConnectionID,"NICK "+ReplaceString(Name, " ", "_")+Chr(13)+Chr(10))
  If Pass <> ""
    SendNetworkString(ConnectionID,"PRIVMSG NickServ :IDENTIFY "+Pass+Chr(13)+Chr(10))
  EndIf
EndProcedure

Procedure IRCChangeNick(Name.s)
  SendNetworkString(ConnectionID,"NICK "+ReplaceString(Name, " ", "_")+Chr(13)+Chr(10))
EndProcedure

Procedure IRCJoin(Channel.s, Server.s)
  SendNetworkString(ConnectionID,"JOIN "+Channel+Chr(13)+Chr(10))
EndProcedure

Procedure IRCLeave(Channel.s)
  SendNetworkString(ConnectionID,"PART "+Channel+Chr(13)+Chr(10))
EndProcedure

Procedure IRCSendText(Channel.s, Text.s)
  SendNetworkString(ConnectionID,"PRIVMSG "+Channel+" :"+Text+Chr(13)+Chr(10))
EndProcedure

Procedure IRCSend(Text.s)
  SendNetworkString(ConnectionID,Text+Chr(13)+Chr(10))
EndProcedure

Procedure.s IRCGetFrom(Str.s)
  Start = FindString(Str.s, ":", 0)+1
  Stop = FindString(Str.s, "!~", Start)
  ProcedureReturn Mid(Str.s, Start, Stop-Start)
EndProcedure

Procedure.s IRCGetTo(Str.s)
  Start = FindString(Str.s, "PRIVMSG", 2)+Len("PRIVMSG")+1
  Stop = FindString(Str.s, ":", Start)-1
  ProcedureReturn Mid(Str.s, Start, Stop-Start)
EndProcedure

Procedure.s IRCGetPingMsg(Str.s)
  Start = FindString(Str.s, ":", 0)+1
  Stop = Len(Str.s)+1
  ProcedureReturn Mid(Str.s, Start, Stop-Start)
EndProcedure

Procedure.s IRCGetLine()
  If NetworkClientEvent(ConnectionID) = 2
    LastElement(RecText())
    *Buffer = AllocateMemory(1024)
    ReceiveNetworkData(ConnectionID, *Buffer, 1024)
    txt.s = PeekS(*Buffer)
    FreeMemory(*Buffer)
    ReplaceString(txt, Chr(13), Chr(10))
    ReplaceString(txt, Chr(10)+Chr(10), Chr(10))
    For k=1 To CountString(txt, Chr(10))
      Line.s = RemoveString(RemoveString(StringField(txt, k, Chr(10)), Chr(10)), Chr(13))
      If Line <> ""
        If FindString(UCase(Line), "PING", 0) Or FindString(UCase(Line), "VERSION", 0)
          SendNetworkString(ConnectionID,ReplaceString(Line,"PING :", "PONG :",0)+Chr(13)+Chr(10))
        Else
          AddElement(RecText())
          RecText() = Line.s
        EndIf
      EndIf
    Next
  EndIf
  If CountList(RecText()) > 0
  FirstElement(RecText())
  txt.s = RecText()
  DeleteElement(RecText())
  ProcedureReturn txt
  EndIf
EndProcedure

Procedure.s IRCGetText(Str.s)
  Start = FindString(Str.s, ":", FindString(Str.s, "PRIVMSG", 2)+Len("PRIVMSG"))
  ProcedureReturn Right(Str, Len(Str)-Start)
EndProcedure

Procedure.f IRCPing(Server.s, Timeout)
  *Buffer = AllocateMemory(1024)
  SendNetworkString(ConnectionID,"PING "+Server+Chr(13)+Chr(10))
  Time = ElapsedMilliseconds()
  While NetworkClientEvent(ConnectionID) <> 2 : Delay(1) : If ElapsedMilliseconds()-Time > Timeout : Break : EndIf : Wend
  If ElapsedMilliseconds()-Time <= Timeout
    T = ElapsedMilliseconds()-Time
    ReceiveNetworkData(ConnectionID, *Buffer, 1024)
    FreeMemory(*Buffer)
    ProcedureReturn T/1000
  Else
    ProcedureReturn -1
  EndIf
EndProcedure

Procedure IRCDisconnect(Msg.s) ;Closes the current connection
  SendNetworkString(ConnectionID,"QUIT "+Msg.s+Chr(13)+Chr(10))
  CloseNetworkConnection(ConnectionID)
EndProcedure

Procedure.s IRCEnumNames(Channel.s) ;Enumerates all names in the channel
  SendNetworkString(ConnectionID,"NAMES "+Channel+Chr(13)+Chr(10))
  *Buffer = AllocateMemory(1024)
  While NetworkClientEvent(ConnectionID) <> 2 : Delay(1) : Wend
  ReceiveNetworkData(ConnectionID, *Buffer, 1024)
  txt.s = PeekS(*Buffer)
  FreeMemory(*Buffer)
  Start = FindString(txt, Channel.s, 0)+Len(Channel.s)+2
  Stop = FindString(txt, Chr(10), 0)
 
  ProcedureReturn Mid(txt.s, Start, Stop-Start)
EndProcedure

;Example
Procedure ResizeWin()
  ResizeGadget(1, 10, WindowHeight(0)-30, WindowWidth(0)-80, 20)
  ResizeGadget(0, 10, 10, WindowWidth(0)-170, WindowHeight(0)-50)
  ResizeGadget(2, WindowWidth(0)-160, 10, 150, WindowHeight(0)-50)
  ResizeGadget(3, WindowWidth(0)-60, WindowHeight(0)-30, 50, 20)
EndProcedure

Channel.s = "##PureBasic.de"
Server.s = "irc.freenode.com"  ;
Nick.s = InputRequester("Nickname", "Give me your Nickname:", "Gast")

;Create the GUI
If OpenWindow(0, 216, 0, 900, 600, "IRC Example "+Channel, #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SystemMenu | #PB_Window_TitleBar)
  If CreateGadgetList(WindowID(0))
      StringGadget(1, 10*2, 270*2, 400*2, 20*2, "") ;The Input
      ListViewGadget(0, 10*2, 10*2, 280*2, 250*2) ;Messages
      ListViewGadget(2, 290*2, 10*2, 150*2, 250*2) ;Names
      ButtonGadget(3, 420*2, 270*2, 20*2, 20*2, "Send") ;Send it
  EndIf
EndIf

IRCConnect(Server.s, 6667)
IRCLogin(Server.s, Nick.s, "")
IRCJoin(Channel.s, Server.s)

Repeat
  Line.s = IRCGetLine() ;Get a messageline
  If Line <> ""
    If IRCGetFrom(Line) <> ""
   
    ClearGadgetItemList(2)
    Names.s = IRCEnumNames(Channel.s)
    Login = 1
   
    For k=1 To CountString(Names, " ") ;List the Names
      Cur.s = StringField(Names, k, " ")
      If Len(Cur) > 1
        AddGadgetItem(2, -1, Cur)
      EndIf
    Next
   
    If UCase(IRCGetTo(Line)) <> UCase(Channel.s)
    AddGadgetItem(0, -1, "<"+IRCGetFrom(Line)+" To "+IRCGetTo(Line)+"> "+IRCGetText(Line))
    Else
    AddGadgetItem(0, -1, "<"+IRCGetFrom(Line)+"> "+IRCGetText(Line))
    EndIf
   
    Else
   
    AddGadgetItem(0, -1, Line)
    EndIf
   
    SetGadgetState(0, CountGadgetItems(0)-1)
   
  Else
   
    If Login = 1 And ElapsedMilliseconds()-LastPing > 15000
      Ping.f = IRCPing(Server.s, 5000)
      SetWindowTitle(0, "IRC Example "+Channel+"  Ping: "+StrF(Ping, 2))
      LastPing = ElapsedMilliseconds()
    EndIf
   
  EndIf
 
 
  Event = WindowEvent()
  
  Select Event
    Case 0
      Delay(20)
    Case #PB_Event_SizeWindow
      ResizeWin()
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 2
          If EventType() = #PB_EventType_LeftDoubleClick
            Msg.s = GetGadgetItemText(2, GetGadgetState(2), 0)
            If Left(Msg, 1) = "@"
              Msg = Right(Msg, Len(Msg)-1)
            EndIf
            SetGadgetText(1, GetGadgetText(1)+"/msg "+Msg+" ")
            SetActiveGadget(1)
          EndIf
        Case 3
          If GetGadgetText(1) <> ""
            If Left(GetGadgetText(1), 1) = "/"
            AllParams.s = Right(GetGadgetText(1), Len(GetGadgetText(1))-FindString(GetGadgetText(1), " ", 0))
            Param1.s = StringField(GetGadgetText(1), 2, " ")
            Param2.s = Right(AllParams.s, Len(AllParams.s)-FindString(AllParams.s, " ", 1))
            Select LCase(StringField(GetGadgetText(1), 1, " "))
              Case "/msg"
                IRCSendText(Param1, Param2)
                AddGadgetItem(0, -1, "<"+Nick+" To "+Param1+"> "+Param2)
              Case "/join"
                IRCJoin(Param1, Server)
              Default
                IRCSend(Right(GetGadgetText(1), Len(GetGadgetText(1))-1))
                AddGadgetItem(0, -1, "<"+Nick+"> "+AllParams.s)
            EndSelect
            Else
            IRCSendText(Channel.s, GetGadgetText(1))
            AddGadgetItem(0, -1, "<"+Nick+"> "+GetGadgetText(1))
            EndIf
            SetGadgetText(1, "")
            SetGadgetState(0, CountGadgetItems(0)-1)
          EndIf
      EndSelect
  EndSelect
Until Event = #PB_Event_CloseWindow
IRCDisconnect("Bye")
End

Verfasst: 19.09.2007 11:53
von Fluid Byte
Ankündigungen?

Verfasst: 19.09.2007 12:47
von HeX0R
Ausserdem fehlt die Quellenangabe.
Ehre wem Ehre gebührt !

Verfasst: 19.09.2007 13:35
von DerProgrammierer78
@Hexor hast recht ... ich habe das hier aus dem Forum ... Aber ich habe ja gesagt, dass ich es nur umgeschrieben habe ;)

Von Macros: http://www.purebasic.fr/german/viewtopi ... c&start=10


@Fluid Byte Der Code den ich umgebaut habe ist auch hier in Ankündigungen ...


Aber nun ergibt sich für mich ein anderes Problem... Ich verbinde mich mit dem OGame-Server und der erkennt den Nick nicht an, mit dem ich mich anmelde:
Bild

Verfasst: 23.09.2007 08:45
von SimonSimCity
Ich finde die Programmierung eines IRC-Chats irgendwie unsinnig.
Vor allem, weil es genügend andere Programme gibt, die die meißten Leute auf ihrem Rechner haben.

Liste aus Wikipedia:
Gängige IRC-Clients

Da IRC zu den etablierteren und älteren Standards im Internet zählt, ist die Auswahl an IRC-Clients heutzutage groß; verbreitete Anwendungen sind:

* Microsoft Windows: ChatZilla, Dana, eMule, EPIC, Pidgin, HydraIRC, KVIrc, Miranda IM, mIRC, Nettalk, Opera, Trillian, Visual IRC, XChat

* Unix/Linux: BitchX, Chatzilla, Pidgin, ircII, irssi, Konversation, Kopete, KVIrc, Opera, sirc, XChat

* Mac OS: Chatzilla, Colloquy, irssi, KVIrc, Opera, XChat, Aqua

* Java-Applets: EIRC, pjirc

* Webserver: CGI:IRC (Perl/Common Gateway Interface)

* Java: jIRC, CBIRC, Jini

* Javascript: jsircbot

* PC/GEOS: IRC BreadboxChat

Verfasst: 23.09.2007 09:44
von DarkDragon
DerProgrammierer78 hat geschrieben:@Hexor hast recht ... ich habe das hier aus dem Forum ... Aber ich habe ja gesagt, dass ich es nur umgeschrieben habe ;)

Von Macros: http://www.purebasic.fr/german/viewtopi ... c&start=10
Von DarkDragon wenn ich bitten darf (Lies 2 Posts weiter).

Verfasst: 23.09.2007 10:09
von Rings
es ist alles nur geklaut...... sumsiesumm

Verfasst: 23.09.2007 12:02
von mk-soft
Bei machen Code von mir weiss ich auch nicht mehr welche Teile ich
selber programmiert, aus dem forum gesucht oder aus der MSDN und Internet übersetzt habe.

Wer etwas ins Forum stellt kann und muss damit rechnen das diese auch
verwendet wird. Ein "Thank´s to" wäre nett wenn die Quelle noch bekannt ist.
Wer aber einen Code der eins zu eins übernommen wurde und als sein
eigenen zu bezeichnet, was hier nicht der fall ist, würde ich mich auch
beschweren.

FF :wink:

Code: Alles auswählen

;-TOP
; Kommentar     : 
; Author        : mk-soft
; Second Author : 
; Datei         : .pb
; Version       : 1.01
; Erstellt      : 
; Geändert      :
; 
; Thank´s to     : All Forum User
;
; Compilermode  :
;
; ***************************************************************************************


Verfasst: 28.10.2007 19:34
von DerProgrammierer78
Ich habe das Programm nun weiter ausgebaut und für das Browserspiel OGame angepasst.

Aber zu aller erst möchte ich mich bei DarkDragon dafür entschuldigen, dass ich eine falsche Quellenangabe gemacht habe. Natürlich ist das original, dass ich umgeschrieben habe von ihm.

Allerdings habe ich nun ein anderes Problem :(

Das Programm läuft tadellos. Aber sobald ich es compiliere und als EXE speicher behauptet mein Virenscanner "Antivir" immer, dass sowohl das originalscript von DarkDragon als auch meine Version ein Virus sei ... :(

Was kann man da machen ????

Link: http://www.toolzentrale.de/irc/ogame/og ... nt_0_1.zip

Screenshot:
Bild

Verfasst: 01.11.2007 12:01
von Norbie
Nichts^^

Das ist die Heuristikfunktion..viele Troyaner Viren Bots, was weis ich, benutzen das IRC um Daten an ihren Urheber zu senden. AVir denkt nun dein Proggy macht das gliche weil es ein paar Wörter des IRC-Protokolls in deiner Exe gefunden hat. Du könntest die strings verschlüsseln oder dein AVir etwas drosseln^^

Cya