Code archives/Networking/BlitzPlus Irc Client 0.7 (Update)
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
/join [your channel] [enter] go go go with Chat!!! New Features: - You can more Channels than one in extra Windows. - You can open a extra Query Window with /Query [Nickname]. - Rejoin when you was kicked. - Autojoin - ... cu, ShadowTurtle | |||||
Global Server$, Port, NickName$, AutoJoin$ Global Network, NetWin, NetMsg Global TextOutPut$ = "´ %NAME% ` %TEXT%" Type Query Field Name$ Field Window Field MsgBox Field InpBox Field InpBut End Type Type Channel Field Name$ Field Window Field MsgBox Field InpBox Field InpBut Field UseBox End Type Type User Field Name$ Field DeleteNow Field Channel.Channel End Type Input_Infos() Start_Network() Function Input_Infos() wW = 250 : wH = 200 Win = CreateWindow("BlitzPlus Irc 0.6", ClientWidth(Desktop())/2-wW/2, ClientHeight(Desktop())/2-wH/2, wW, wH, 0, 1) InputA = CreateTextField(60, 12+ToDown, wW-70, 20, Win) : SetGadgetText InputA, "irc.blitzed.org" CreateLabel("Server :", 15, 15+ToDown, 45, 20, Win, 0) : ToDown = ToDown + 25 InputB = CreateTextField(60, 12+ToDown, wW-70, 20, Win) : SetGadgetText InputB, "6667" CreateLabel("Port :", 15, 15+ToDown, 45, 20, Win, 0) : ToDown = ToDown + 35 InputC = CreateTextField(60, 12+ToDown, wW-70, 20, Win) : SetGadgetText InputC, "BlitzBasicUser" CreateLabel("Name :", 15, 15+ToDown, 45, 20, Win, 0) : ToDown = ToDown + 25 InputD = CreateTextField(60, 12+ToDown, wW-70, 20, Win) : SetGadgetText InputD, "#Project" CreateLabel("Autojoin :", 15, 15+ToDown, 45, 20, Win, 0) : ToDown = ToDown + 25 ButtonA = CreateButton("Connect", 15, 15+ToDown, wW-25, 20, Win) : ToDown = ToDown + 25 ButtonB = CreateButton("Close", 15, 15+ToDown, wW-25, 20, Win) While 1 tmp = WaitEvent() If EventSource() = ButtonA Then Server$ = TextFieldText(InputA) Port = TextFieldText(InputB) NickName$ = TextFieldText(InputC) AutoJoin$ = TextFieldText(InputD) FreeGadget Win Return End If If EventSource() = ButtonB Then End Wend End Function Function Start_Network() wW = 400 : wH = 575 : iH = 20 : bW = 40 NetWin = CreateWindow("BlitzPlus Irc - ["+Server$+"]", ClientWidth(Desktop())/5-wW/2, ClientHeight(Desktop())/2-wH/2, wW, wH, 0, 1) NetMsg = CreateTextArea(-1, 0, wW-3, wH-28-iH, NetWin) NetInput = CreateTextField(0, wH-26-iH, wW-6-bW, iH, NetWin) NetButInput = CreateButton("Send", wW-6-bW, wH-26-iH, bW, iH, NetWin) AddTextAreaText NetMsg, "Connection to '"+Server$+"' Server ..." + Chr$(10) Network = OpenTCPStream(Server$, Port) If OpenIRCSession(Network) Then AddTextAreaText NetMsg, "Connection is Ready." + Chr$(10) + Chr$(10) Else AddTextAreaText NetMsg, "Connection to '"+Server$+"' Server is Abordet." + Chr$(10) RuntimeError "Connection to '"+Server$+"' Server is Abordet." + Chr$(10) End If If AutoJoin$<>"" Then JoinChannel(AutoJoin$) NetClient = 1 While NetClient If Network Bytes=ReadAvail(Network) While Bytes Irc_Read ReadLine(Network) Bytes=ReadAvail(Network) Wend End If tmp = WaitEvent(2) tmpB = EventID() If Network For Query.Query = Each Query If tmpB = $401 Then If EventSource() = Query\InpBut Or (EventData() = 13 And EventSource()=Query\InpBox) Then TheText$ = TextFieldText(Query\InpBox) If Not TheText$ = "" Then If Not EnterBef(TheText$) Then WriteLine Network, "PRIVMSG " + Query\Name$ + " :" + TheText$ AddTextAreaText Query\MsgBox, MO$(NickName$, TheText$) + Chr$(10) End If SetGadgetText Query\InpBox, "" End If End If ElseIf tmpB = $803 If EventSource() = Query\Window Then FreeGadget Query\Window Delete Query End If End If Next For Channel.Channel = Each Channel If tmpB = $401 Then If EventSource() = Channel\InpBut Or (EventData() = 13 And EventSource()=Channel\InpBox) Then TheText$ = TextFieldText(Channel\InpBox) If Not TheText$ = "" Then If Not EnterBef(TheText$) Then WriteLine Network, "PRIVMSG " + Channel\Name$ + " :" + TheText$ AddTextAreaText Channel\MsgBox, MO$(NickName$, TheText$) + Chr$(10) End If SetGadgetText Channel\InpBox, "" End If End If ElseIf tmpB = $803 Then If EventSource() = Channel\Window Then WriteLine Network, "PART " + Channel\Name$ For User.User = Each User If User\Channel = Channel Then Delete User End If Next FreeGadget Channel\Window Delete Channel End If End If Next End If If tmpB = $803 Then If EventSource() = NetWin Then End ElseIf tmpB = $401 Then If EventSource() = NetButInput Or (EventData() = 13 And EventSource()=NetInput) Then TheText$ = TextFieldText(NetInput) If Not TheText$ = "" Then tp$ = Lower(Trim(TheText$)) EnterBef(tp$) SetGadgetText NetInput, "" End If End If End If Wend End Function Function EnterBef(tp$, tna$ = "") If Lower(Mid(tp$,1,5)) = "/join" Then JoinChannel(Mid(Trim(tp$),7)) Return 1 ElseIf Lower(Mid(tp$,1,4)) = "/msg" Then jj$ = Trim(tp$) toyou$ = GetPar(jj$, 0) thetxt$ = Mid$(jj$,7+Len(toyou$)) WriteLine Network, "PRIVMSG " + toyou$ + " :" + thetxt$ For Channel.Channel = Each Channel If Lower(Channel\Name$) = Lower(toyou$) Then AddTextAreaText Channel\MsgBox, MO$(NickName$, thetxt$) + Chr$(10) End If Next For User.User = Each User If Lower(NS$(User\Name$)) = Lower(NS$(toyou$)) Then Query.Query = OpenQuery(toyou) AddTextAreaText Query\MsgBox, MO(Query\Name$, thetxt$) + Chr$(10) End If Next Return 1 ElseIf Lower(Mid(tp$,1,6)) = "/query" Then jj$ = Trim(tp$) toyou$ = GetPar(jj$, 0) Query.Query = OpenQuery(toyou) Else Return 0 End If End Function ; Here comes the another Functions Function MO$(TheName$, TheText$) Return Replace(Replace(TextOutPut$, "%TEXT%", TheText$), "%NAME%", TheName$) End Function Function JoinChannel(ChanName$) wW = 400 : wH = 375 : iH = 20 : bW = 40 : lbG = 120 Channel.Channel = New Channel Channel\Name$ = ChanName$ Channel\Window = CreateWindow("["+Server$+"] :: " + ChanName$, ClientWidth(Desktop())/4-wW/2+fA, ClientHeight(Desktop())/2-wH/2, wW, wH, NetWin, 1) Channel\MsgBox = CreateTextArea(-1, 0, wW-6-lbG, wH-28-iH, Channel\Window) Channel\InpBox = CreateTextField(0, wH-26-iH, wW-6-bW, iH, Channel\Window) Channel\InpBut = CreateButton("Send", wW-6-bW, wH-26-iH, bW, iH, Channel\Window) Channel\UseBox = CreateListBox(wW-6-lbG, 0, lbG, wH-28-iH, Channel\Window) WriteLine Network, "JOIN " + Channel\Name$ ; AddTextAreaText Query\MsgBox, "` "+Query\Name$+" ´ " + GetContext$(tLine$) + Chr$(10) ; tmps=1 End Function Function Irc_Read(tLine$) TheText$ = GetPar(tLine$, 0) If TheText$ = "NOTICE" Then AddTextAreaText NetMsg, "Notice from " + GetFromNick$(tLine$) + " :: " + GetContext$(tLine$) + Chr$(10) ElseIf TheText$ = "PRIVMSG" Then j$ = GetPar(tLine$, 1) If Lower(j$) = Lower(NickName$) Then tmps = 0 For Query.Query = Each Query If Lower(NS$(Query\Name$)) = Lower(NS$(GetFromNick$(tLine$))) Then AddTextAreaText Query\MsgBox, MO(Query\Name$, GetContext$(tLine$)) + Chr$(10) tmps = tmps + 1 End If fA = fA + 10 Next If tmps=0 Then Query.Query = OpenQuery(GetFromNick$(tLine$)) AddTextAreaText Query\MsgBox, MO(Query\Name$, GetContext$(tLine$)) + Chr$(10) tmps=1 End If Else For Channel.Channel = Each Channel If Channel\Name$ = j$ Then AddTextAreaText Channel\MsgBox, MO(GetFromNick$(tLine$), GetContext$(tLine$)) + Chr$(10) End If Next End If ElseIf TheText$ = "353" Then j$ = GetPar(tLine$, 3) For Channel.Channel = Each Channel If Channel\Name$ = j$ Then For User.User = Each User If User\Channel = Channel Then Delete User End If Next list$=GetPar(tLine$,1,":") Repeat newname$=GetPar(list$,n) If newname$<>lastname$ And newname$<>"" Then User.User = New User User\Name$ = newname$ User\Channel = Channel Else Exit End If n=n+1 : lastname$=newname$ Forever ActualUserList(Channel) End If Next ElseIf TheText$ = "PART" Then ch$ = Lower(GetPar(tLine$,2)) For User.User = Each User If Lower(User\Channel\Name$) = ch$ And NS(User\Name$) = NS(GetFromNick(tLine$)) Then AddTextAreaText User\Channel\MsgBox, GetFromNick(tLine$) + " has Left " + ch$ + "." + Chr(10) User\DeleteNow = 1 ActualUserList(User\Channel) Delete User End If Next ElseIf TheText$ = "JOIN" Then Nick$ = GetFromNick(tLine$) TheCha$ = GetPar(tLine$,2,":") For Channel.Channel = Each Channel If Lower(Replace(Channel\Name$,"#","")) = Lower(Replace(TheCha$,"#","")) Then If Nick$ = NickName$ Then AddTextAreaText Channel\MsgBox, "You has joined " + TheCha$ + "." + Chr(10) Else AddTextAreaText Channel\MsgBox, Nick$ + " has joined " + TheCha$ + "." + Chr(10) End If User.User = New User User\Name$ = Nick$ User\Channel = Channel ActualUserList(Channel) End If Next ElseIf TheText$ = "NICK" Then OldNick$ = GetFromNick(tLine$) NewNick$ = GetPar(tLine$,2,":") For User.User = Each User If User\Name$ = OldNick$ Then AddTextAreaText User\Channel\MsgBox, OldNick$ + " is now as " + NewNick$ + "." + Chr(10) User\Name$ = NewNick$ ActualUserList(User\Channel) End If Next For Query.Query = Each Query If Query\Name$ = OldNick$ Then Query\Name$ = NewNick$ SetGadgetText Query\Window, "["+Server$+"] :: Query with " + Query\Name$ End If Next ElseIf TheText$ = "KICK" Then ANick$ = GetPar(tLine$, 2) BNick$ = GetFromNick(tLine$) Chan$ = GetPar(tLine$, 1) For Channel.Channel = Each Channel If Channel\Name$ = Chan$ Then If ANick$ = NickName$ Then AddTextAreaText Channel\MsgBox, "You was kicked by " + BNick$ + Chr$(10) AddTextAreaText Channel\MsgBox, "You rejoin now ..." + Chr$(10) WriteLine Network, "JOIN " + Chan$ Else AddTextAreaText Channel\MsgBox, ANick$ + " was kicked by " + BNick$ + Chr$(10) End If End If Next ElseIf TheText$ = "MODE" Then Chan$ = GetPar(tLine$, 1) Nick$ = GetFromNick(tLine$) Art$ = GetPar(tLine$, 2) Where$ = GetPar(tLine$, 3) For Channel.Channel = Each Channel If Channel\Name$ = Chan$ Then AddTextAreaText Channel\MsgBox, Nick$ + " sets Mode: " + Art$ + " " + Where$ + Chr$(10) End If Next ElseIf TheText$ = "TOPIC" Then Nick$ = GetFromNick(tLine$) Chan$ = GetPar(tLine$,1) topic$ = GetContext(tLine$) For Channel.Channel = Each Channel If Channel\Name$ = Chan$ Then AddTextAreaText Channel\MsgBox, Nick$ + " changes Topic to '"+topic$+"'" + Chr$(10) End If Next ; RuntimeError Chan$ ElseIf "401" Then ; AddTextAreaText NetMsg, "AddError[401]: No such nick/channel." + Chr$(10) ElseIf "402" Then AddTextAreaText NetMsg, "AddError[402]: No such server." + Chr$(10) ElseIf "403" Then AddTextAreaText NetMsg, "AddError[403]: No such channel." + Chr$(10) ElseIf "403" Then AddTextAreaText NetMsg, "AddError[403]: No such channel." + Chr$(10) ElseIf "404" Then AddTextAreaText NetMsg, "Error[404]: Cannot send to channel." ElseIf "405" Then AddTextAreaText NetMsg, "Error[405]: You cannot join anymore channels." ElseIf "406" Then AddTextAreaText NetMsg, "Error[406]: There was no such nickname." ElseIf "407" Then AddTextAreaText NetMsg, "Error[407]: Duplicate recipients, no message delivered." ElseIf "409" Then AddTextAreaText NetMsg, "Error[409]: No orgin specified." ElseIf "411" Then AddTextAreaText NetMsg, "Error[411]: No recipient given." ElseIf "412" Then AddTextAreaText NetMsg, "Error[412]: No text to send." ElseIf "413" Then AddTextAreaText NetMsg, "Error[413]: No top level domain specified." ElseIf "414" Then AddTextAreaText NetMsg, "Error[414]: Wildcard in top level domain." ElseIf "421" Then AddTextAreaText NetMsg, "Error[421]: Unknown command." ElseIf "422" Then AddTextAreaText NetMsg, "Error[422]: MOTD file missing." ElseIf "423" Then AddTextAreaText NetMsg, "Error[423]: No addministrative info available." ElseIf "424" Then AddTextAreaText NetMsg, "Error[424]: File error." ElseIf "431" Then AddTextAreaText NetMsg, "Error[431]: No nickname given." ElseIf "432" Then AddTextAreaText NetMsg, "Error[432]: Erroneus nickname." ElseIf "433" Then AddTextAreaText NetMsg, "Error[433]: Nickname already in use." ElseIf "436" Then AddTextAreaText NetMsg, "Error[436]: Nickname Collision KILL" ElseIf "441" Then AddTextAreaText NetMsg, "Error[441]: They aren't on that channel." ElseIf "442" Then AddTextAreaText NetMsg, "Error[442]: You're not on that channel." ElseIf "443" Then AddTextAreaText NetMsg, "Error[443]: User already in that channel." ElseIf "444" Then AddTextAreaText NetMsg, "Error[444]: User not logged on." ElseIf "445" Then AddTextAreaText NetMsg, "Error[445]: SUMMON has been disabled." ElseIf "446" Then AddTextAreaText NetMsg, "Error[446]: USERS has been disabled." ElseIf "451" Then AddTextAreaText NetMsg, "Error[451]: You have not registered." ElseIf "461" Then AddTextAreaText NetMsg, "Error[461]: Not enough parameters." ElseIf "462" Then AddTextAreaText NetMsg, "Error[462]: You may not register." ElseIf "463" Then AddTextAreaText NetMsg, "Error[463]: You're host isn't among privliged." ElseIf "464" Then AddTextAreaText NetMsg, "Error[464]: Password incorecct." ElseIf "465" Then AddTextAreaText NetMsg, "Error[465]: You are banned from this server." ElseIf "467" Then AddTextAreaText NetMsg, "Error[467]: Channel key already set." ElseIf "471" Then AddTextAreaText NetMsg, "Error[471]: Cannot join channel (+l)." ElseIf "472" Then AddTextAreaText NetMsg, "Error[472]: Uknown mode." ElseIf "473" Then AddTextAreaText NetMsg, "Error[473]: Cannot join channel (+i)." ElseIf "474" Then AddTextAreaText NetMsg, "Error[474]: Cannot join channel (+b)." ElseIf "475" Then AddTextAreaText NetMsg, "Error[474]: Cannot join channel (+k)." ElseIf "481" Then AddTextAreaText NetMsg, "Error[481]: Permission denied, you are not an IRC operator." ElseIf "482" Then AddTextAreaText NetMsg, "Error[482]: You're not a channel operator." ElseIf "483" Then AddTextAreaText NetMsg, "Error[483]: You cant kill a server!" ElseIf "491" Then AddTextAreaText NetMsg, "Error[491]: No O-Lines from your host." ElseIf "501" Then AddTextAreaText NetMsg, "Error[501]: Uknown mode flag." ElseIf "502" Then AddTextAreaText NetMsg, "Error[502]: Can't change mode for other users." Else ; AddTextAreaText NetMsg, tLine$ + Chr$(10) End If ; AddTextAreaText NetMsg, tLine$ + Chr$(10) End Function Function OpenQuery.Query(Name$) wW = 400 : wH = 375 : iH = 20 : bW = 40 Query.Query = New Query Query\Name$ = Name$ Query\Window = CreateWindow("["+Server$+"] :: Query with " + Query\Name$, ClientWidth(Desktop())/4-wW/2+fA, ClientHeight(Desktop())/2-wH/2, wW, wH, NetWin, 1) Query\MsgBox = CreateTextArea(-1, 0, wW-3, wH-28-iH, Query\Window) Query\InpBox = CreateTextField(0, wH-26-iH, wW-6-bW, iH, Query\Window) Query\InpBut = CreateButton("Send", wW-6-bW, wH-26-iH, bW, iH, Query\Window) Return Query End Function Function NS$(jj$) Return Replace(Replace(Replace(Replace(jj$, "!", ""), "-", ""), "+", ""), "@", "") End Function Function ActualUserList(Channel.Channel) ClearGadgetItems Channel\UseBox For User.User = Each User If User\Channel = Channel Then If User\DeleteNow = 0 Then AddGadgetItem Channel\UseBox, User\Name$ End If Next ; AddGadgetItem Channel\UseBox, "" ; AddGadgetItem Channel\UseBox, NickName$ End Function Function GetContext$(msg$) Local break1%=Instr(msg,":") Local break2%=Instr(msg,":",break1+1) Return Mid(msg,break2+1) End Function Function GetFromNick$(msg$) Return Mid(msg,Instr(msg,":")+1,(Instr(msg,"!")-Instr(msg,":")-1)) End Function Function GetPar$(msg$,par%=0,bChr$=" ") Local sbreak%=1,ebreak% For i=0 To par If Instr(msg,bChr,sbreak+1) sbreak=Instr(msg,bChr,sbreak+1) Else Exit EndIf Next ebreak=Instr(msg,bChr,sbreak+1) If ebreak Return Mid(msg,sbreak+1,ebreak-sbreak-1) Else Return Mid(msg,sbreak+1) EndIf End Function Function OpenIRCSession(stream,timeout%=2000) Local time=MilliSecs() While Not stream If (MilliSecs()-time)>timeout Return 0 Wend Hostname$ = "BlitzPlus Irc" WriteLine stream,"USER "+NickName$+" "+Hostname$+" "+Server$+" :"+NickName$ WriteLine stream,"NICK "+NickName$ Return Stream End Function |
Comments
| ||
The CreateWindow function don't exist |
| ||
@Smokey - It's a BlitzPlus function. If you're using Blitz3D, then it won't work. |
| ||
This doesn't seem to work. It all appears OK, but doesn't connect to channels with other people in. It seems to create its own channels in limbo. Not sure whats wrong. Also, why do you use huge ElseIf lists instead of Select..Case? |
| ||
This is very old. Here is the new version: http://www.shadowturtle.de/blitzplusirc.rar cu |
| ||
It is still very buggy. It only connects some of the time and one time I connected and it displayed each line four times. |
| ||
In memory of Mahe, i've killed some Bugs. It does now connect on >every< Server, but you must wait a long connect-time. Here is a small screenshot: Download: www.shadowturtle.de/blitzplusirc.rar |
| ||
Can I have an english version of the source? I don't know german. |
Code Archives Forum