Code archives/BlitzPlus Gui/BlitzPlus Irc Client 0.7 (Update)

This code has been declared by its author to be Public Domain code.

Download source code

BlitzPlus Irc Client 0.7 (Update) by ShadowTurtle2003
/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

None.

Code Archives Forum