Verfasst: 10.03.2006 14:21
... und vielleicht mit Opera arbeiten(möchten) sei ans Herz gelegt das der integrierte IRC-Client sehr gut funtktioniert.Für IRC-Muffel, die sich nicht trauen einen IRC Clienten zu laden...
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
... und vielleicht mit Opera arbeiten(möchten) sei ans Herz gelegt das der integrierte IRC-Client sehr gut funtktioniert.Für IRC-Muffel, die sich nicht trauen einen IRC Clienten zu laden...
Code: Alles auswählen
InitNetwork()
Global ConnectionID.l
NewList RecText.s()
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()-30, WindowWidth()-20, 20)
ResizeGadget(0, 10, 10, WindowWidth()-170, WindowHeight()-50)
ResizeGadget(2, WindowWidth()-160, 10, 150, WindowHeight()-50)
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, #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SystemMenu | #PB_Window_TitleBar, "IRC Example "+Channel)
If CreateGadgetList(WindowID())
StringGadget(1, 10*2, 270*2, 430*2, 20*2, "", #PB_String_MultiLine) ;The Input
ListViewGadget(0, 10*2, 10*2, 280*2, 250*2) ;Messages
ListViewGadget(2, 290*2, 10*2, 150*2, 250*2) ;Names
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 EventGadgetID()
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+" ")
ActivateGadget(1)
EndIf
Case 1
If EventType() = #PB_EventType_ReturnKey And 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
Hmm... hab mir auch schon überlegt sowas zu machen, nur da machen halt auch die meisten Provider nicht mit(Meiner [der von PureArea.Net] eingeschlossen). Aber über Google lässt sich vielleicht etwas finden.Rings hat geschrieben:Gibts eigentlich sowas wie ein Browser IRC-Chat , der nur über den normalen Browser läuft und somit ne firewall umgehen kann ?
Also nich irgendeinen Port 6667 benötigt, sonder fein über Port 80 abwickelt.
Evtl. so ne Art Proxy-IRC .
Wenn net, muss ich mir was einfallen lassen......
(sitz grad hinter einer)
Tjo damals wusste ich sowas nicht. Wie soll ich es jetzt ausbessern? Alle meine Posts durchsuchen und bearbeiten? Nee, zuviel, zu anstrengend.Kaeru Gaman hat geschrieben:empfehlenswert wäre es da auch,
dass der programmierer 2-4 kommentarzeilen mit u.a.
seinem nickname an den anfang des programms setzt.