Code: Select all
; -------------------------------------------------
; Name: LAN Chat 1.0
; Author: Joakim L. Christiansen
; Last edited: 2005-10-11
; Comment: Just a simple chat program for a LAN
; Updated: 05.11.2006 for PB 4.0 Final and jaPBe v3
; -------------------------------------------------
;-## Program start ##
;-Enumeration
Enumeration ;Windows
#Main
EndEnumeration
Enumeration ;Gadgets
#Chat
#Message
#Send
#Options
#Host
#Join
#ServerIP
#JoinIP
#TextNickname
#Nickname
#Frame1
#oHost
#oJoin
#oNone
EndEnumeration
Enumeration ;Menues
#Menu
EndEnumeration
Enumeration ;Menu items
#Show
#Exit
EndEnumeration
Enumeration ;Systray icons
#SysIcon
EndEnumeration
Enumeration ;Fonts
#CourierNew12Bold
EndEnumeration
Enumeration ;Status
#None
#Server
#Client
EndEnumeration
#NewLine = Chr(13)+Chr(10)
;-Fonts
LoadFont(#CourierNew12Bold,"Courier New",10,#PB_Font_Bold)
;-Open window
If OpenWindow(#Main,0,0,230,135,"LAN Chat v1.0",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget)
If CreateGadgetList(WindowID(#Main))
EditorGadget(#Chat,5,5,200,100)
SendMessage_(GadgetID(#Chat),#EM_SETREADONLY,#True,0)
StringGadget(#Message,5,110,175,20,"")
; No longer Available -> ActivateGadget(#Message)
ButtonGadget(#Send,185,110,40,20,"Send")
ButtonGadget(#Options,210,5,15,100,"OPTIONS",#PB_Button_Default|#PB_Button_MultiLine|#PB_Button_Toggle)
ButtonGadget(#Host,230,85,90,20,"Host chat")
ButtonGadget(#Join,230,110,90,20,"Join Chat")
StringGadget(#ServerIP,320,85,90,20,"",#PB_String_ReadOnly)
IPAddressGadget(#JoinIP,320,110,90,20)
TextGadget(#TextNickname,230,60,85,20,"Nickname:",#PB_Text_Center)
SetGadgetFont(#TextNickname,FontID(#CourierNew12Bold))
StringGadget(#Nickname,320,60,90,20,"Nicname")
Frame3DGadget(#Frame1,230,5,180,45,"Startup action:")
OptionGadget(#oHost,240,25,45,15,"Host")
OptionGadget(#oJoin,295,25,45,15,"Join")
OptionGadget(#oNone,350,25,45,15,"None")
;Tooltips
GadgetToolTip(#Message,"Enter your message here.")
GadgetToolTip(#Send,"Click to send your message.")
GadgetToolTip(#Options,"Click to show/hide options.")
GadgetToolTip(#oHost,"Host a chat server on startup.")
GadgetToolTip(#oJoin,"Join a chat server on startup.")
GadgetToolTip(#oNone,"Do nothing on startup.")
GadgetToolTip(#Nickname,"Enter your nickname here.")
GadgetToolTip(#Host,"Click to create your own chat server.")
GadgetToolTip(#Join,"Click to join an existing chat server.")
GadgetToolTip(#ServerIP,"This is your local ip address.")
GadgetToolTip(#JoinIP,"The ip address you would like to join.")
Else
MessageRequester("WTF!","CreateGadgetList() Failed!",#MB_ICONERROR)
End
EndIf
If CreatePopupMenu(#Menu)
MenuItem(#Show,"Show")
MenuItem(#Exit,"Exit")
EndIf
Else
MessageRequester("WTF!","OpenWindow() Failed!",#MB_ICONERROR)
End
EndIf
;-Initialize the network
If InitNetwork() = #False
MessageRequester("WTF!","InitNetwork() Failed!"+#NewLine+"No TCP/IP stack available on the system.",#MB_ICONERROR)
End
EndIf
;-Get local ip address
ExamineIPAddresses()
SetGadgetText(#ServerIP,IPString(NextIPAddress()))
;-Variables
Global NewList ClientID.l()
Global Status.b, Port.w, ServerID.l
*Buffer.l = AllocateMemory(1000)
DataLength.l
String.s
Icon.l = ExtractIcon_(WindowID(#Main),"LAN Chat.exe",0)
Minimized.b
EndProgram.b
Global mServer.l
Procedure Disconnect()
Select Status
Case #Server
ForEach ClientID()
SendNetworkString(ClientID(),GetGadgetText(#Nickname)+" (server) disconnected.")
Next
CloseNetworkServer(mServer)
Case #Client
SendNetworkString(ServerID,GetGadgetText(#Nickname)+" disconnected.")
CloseNetworkConnection(ServerID)
EndSelect
EndProcedure
Procedure Host()
Disconnect()
mServer = CreateNetworkServer(#PB_Any, Port)
If mServer
Status = #Server
Else
MessageRequester("WTF!","Can't create server! (port in use?)",#MB_ICONWARNING)
EndIf
EndProcedure
Procedure Join()
Disconnect()
ServerID = OpenNetworkConnection(GetGadgetText(#JoinIP),Port)
If ServerID
Status = #Client
SendNetworkString(ServerID,GetGadgetText(#Nickname)+" connected.")
Else
MessageRequester("WTF!","Can't join the server!"+#NewLine+"Is the server running?",#MB_ICONWARNING)
EndIf
EndProcedure
;-Read config file
OpenPreferences("Config.ini")
SetGadgetText(#Nickname,ReadPreferenceString("Nickname","MyName"))
String = ReadPreferenceString("JoinIP","0.0.0.0")
SetGadgetState(#JoinIP,MakeIPAddress(Val(StringField(String,1,".")),Val(StringField(String,2,".")),Val(StringField(String,3,".")),Val(StringField(String,4,"."))))
Port = ReadPreferenceLong("Port",6010)
Select ReadPreferenceLong("StartUpAction",0)
Case 0: SetGadgetState(#oNone,#True)
Case 1
SetGadgetState(#oHost,#True)
Host()
Case 2
SetGadgetState(#oJoin,#True)
Join()
EndSelect
ClosePreferences()
Repeat
Delay(4)
;-Minimized/not minimized
If IsIconic_(WindowID(#Main)) = #True And Minimized = #False
Minimized = #True
HideWindow(#Main,#True)
AddSysTrayIcon(#SysIcon,WindowID(#Main),Icon)
SysTrayIconToolTip(#SysIcon,"LAN Chat")
ElseIf IsIconic_(WindowID(#Main)) = #False And Minimized = #True
Minimized = #False
RemoveSysTrayIcon(#SysIcon)
EndIf
WindowEvent = WindowEvent()
;-## Window events ##
Select WindowEvent
Case #PB_Event_SizeWindow
Case #PB_Event_CloseWindow ;-Close window
EndProgram = #True
Case #PB_Event_SysTray ;-Systray click
If EventType() = #PB_EventType_RightClick
DisplayPopupMenu(#Menu,WindowID(#Main))
ElseIf EventType() = #PB_EventType_LeftDoubleClick
ShowWindow_(WindowID(#Main),#SW_MINIMIZE)
Delay(100)
ShowWindow_(WindowID(#Main),#SW_RESTORE)
EndIf
Case #PB_Event_Menu ;-Systray menu
Select EventMenu()
Case #Show
ShowWindow_(WindowID(#Main),#SW_MINIMIZE)
Delay(100)
ShowWindow_(WindowID(#Main),#SW_RESTORE)
Case #Exit
EndProgram = #True
EndSelect
Case #WM_KEYDOWN ;-Enter key pressed inside #Message
If EventwParam()=#VK_RETURN And GetFocus_()=GadgetID(#Message)
PostMessage_(WindowID(#Main),#WM_COMMAND,#PB_EventType_LeftClick,GadgetID(#Send))
EndIf
Case #PB_Event_Gadget
Select EventGadget()
Case #Options ;-Options button
If GetGadgetState(#Options)
ResizeWindow(#Main, WindowX(#Main), WindowY(#Main), 415,135)
Else
ResizeWindow(#Main, WindowX(#Main), WindowY(#Main), 230,135)
EndIf
Case #Host: Host() ;-Host button
Case #Join: Join() ;-Join button
Case #Send ;-Send button
If GetGadgetText(#Message) > ""
Select Status
Case #Server
AddGadgetItem(#Chat,-1,GetGadgetText(#Nickname)+": "+GetGadgetText(#Message))
SendMessage_(GadgetID(#Chat),#EM_SCROLL,#SB_BOTTOM,0)
ForEach ClientID()
SendNetworkString(ClientID(),GetGadgetText(#Nickname)+": "+GetGadgetText(#Message))
Next
Case #Client
SendNetworkString(ServerID,GetGadgetText(#Nickname)+": "+GetGadgetText(#Message))
EndSelect
SetGadgetText(#Message,"")
EndIf
EndSelect
EndSelect
;-## Network events ##
Select Status
Case #Server
Select NetworkServerEvent()
Case 1 ;-Client connected
AddElement(ClientID())
ClientID() = EventClient()
Case 2 ;-Server receive data
DataLength = ReceiveNetworkData(EventClient(),*Buffer,1000)
AddGadgetItem(#Chat,-1,PeekS(*Buffer,DataLength))
SendMessage_(GadgetID(#Chat),#EM_SCROLL,#SB_BOTTOM,0)
ForEach ClientID()
SendNetworkString(ClientID(),PeekS(*Buffer,DataLength))
Next
If Minimized
ShowWindow_(WindowID(#Main),#SW_MINIMIZE)
Delay(100)
ShowWindow_(WindowID(#Main),#SW_RESTORE)
EndIf
Case 4 ;-Client disconnected
ForEach ClientID()
If ClientID() = EventClient()
DeleteElement(ClientID())
EndIf
Next
EndSelect
Case #Client
Select NetworkClientEvent(ServerID)
Case 2 ;-Client receive data
DataLength = ReceiveNetworkData(ServerID,*Buffer,1000)
AddGadgetItem(#Chat,-1,PeekS(*Buffer,DataLength))
SendMessage_(GadgetID(#Chat),#EM_SCROLL,#SB_BOTTOM,0)
If Minimized
ShowWindow_(WindowID(#Main),#SW_MINIMIZE)
Delay(100)
ShowWindow_(WindowID(#Main),#SW_RESTORE)
EndIf
EndSelect
EndSelect
Until EndProgram
;-## End program ##
;-Disconnect
Disconnect()
;-Save config file
If CreatePreferences("Config.ini")
If GetGadgetState(#oNone)
WritePreferenceLong("StartUpAction",0)
ElseIf GetGadgetState(#oHost)
WritePreferenceLong("StartUpAction",1)
ElseIf GetGadgetState(#oJoin)
WritePreferenceLong("StartUpAction",2)
EndIf
WritePreferenceString("Nickname",GetGadgetText(#Nickname))
WritePreferenceString("JoinIP",GetGadgetText(#JoinIP))
WritePreferenceLong("Port",Port)
ClosePreferences()
Else
MessageRequester("WTF!","Can't save config file! (write protected?)",#MB_ICONWARNING)
EndIf
; jaPBe Version=3.6.4.503
; FoldLines=000A000C000D001C001D001F002000230024002600270029002A002E
; Build=1
; Language=0x0000 Language Neutral
; FirstLine=224
; CursorPosition=278
; EnableAsm
; EnableThread
; UseIcon=Icon.ico
; ExecutableFormat=Windows
; SaveDeclare
; EOF