;this is the main server body ;created june 2003 ;based upon the tdhserver ;last mod 14 sept 2003 ;added multiple server support ;and removed login account management options IncludeFile "serverwin.pb" IncludeFile "network.pb" If InitNetwork()=#False MyDebug("InitNetwork","False","Unable to initialize network, shutting down.") End EndIf Procedure Uncheck() SetMenuItemState(#MenuBar_1,#Menu_6,0) SetMenuItemState(#MenuBar_1,#Menu_7,0) SetMenuItemState(#MenuBar_1,#Menu_8,0) SetMenuItemState(#MenuBar_1,#Menu_14,0) EndProcedure Procedure FillList() ClearGadgetItemList(#Gadget_List) ;then fill based upon sort method fill.l=0 fill=fill+GetMenuItemState(#MenuBar_1,#Menu_6) fill=fill+2*GetMenuItemState(#MenuBar_1,#Menu_7) fill=fill+3*GetMenuItemState(#MenuBar_1,#Menu_8) fill=fill+4*GetMenuItemState(#MenuBar_1,#Menu_14) Select fill Case 1 ;sort by User Name ResetList(User()) While NextElement(User()) m.l=CountGadgetItems(#Gadget_List) user()\Posit=-1 If m>0 UN.s=GetGadgetItemText(#Gadget_List,m-1,0) If User()\Name>UN m=0 EndIf EndIf If m>0 For r=0 To m-1 UN.s=GetGadgetItemText(#Gadget_List,r,0) If UN>User()\Name AddGadgetItem(#Gadget_List,r,User()\Name) SetGadgetItemText(#Gadget_List,r,User()\RoomName,1) SetGadgetItemText(#Gadget_List,r,Str(User()\Status),2) SetGadgetItemText(#Gadget_List,r,User()\RegCode,3) SetGadgetItemText(#Gadget_List,r,User()\Password,4) r=m EndIf Next r Else AddGadgetItem(#Gadget_List,-1,User()\Name) r=CountGadgetItems(#Gadget_List)-1 SetGadgetItemText(#Gadget_List,r,User()\RoomName,1) SetGadgetItemText(#Gadget_List,r,Str(User()\Status),2) SetGadgetItemText(#Gadget_List,r,User()\RegCode,3) SetGadgetItemText(#Gadget_List,r,User()\Password,4) EndIf Wend Case 2 ;list all external servers ResetList(Server()) While NextElement(Server()) AddGadgetItem(#Gadget_List,-1,Server()\Name) r=CountGadgetItems(#Gadget_List)-1 SetGadgetItemText(#Gadget_List,r,Server()\RoomName,1) SetGadgetItemText(#Gadget_List,r,Str(Server()\CPlayers),2) SetGadgetItemText(#Gadget_List,r,Server()\UserISP,3) ;SetGadgetItemText(#Gadget_List,r,User()\Password,4) Wend ;and of course, this server... AddGadgetItem(#Gadget_List,-1,"Main Server") r=CountGadgetItems(#Gadget_List)-1 SetGadgetItemText(#Gadget_List,r,"Main Loby",1) SetGadgetItemText(#Gadget_List,r,Str(CountList(User())),2) SetGadgetItemText(#Gadget_List,r,GetLocalISP(),3) Case 3 ;list game rooms ResetList(Room()) While NextElement(Room()) AddGadgetItem(#Gadget_List,-1,Room()\UserISP) r=CountGadgetItems(#Gadget_List)-1 SetGadgetItemText(#Gadget_List,r,Room()\RoomName,1) SetGadgetItemText(#Gadget_List,r,Str(Room()\CPlayers)+"/"+Str(Room()\MPlayers),2) SetGadgetItemText(#Gadget_List,r,User()\RegCode,3) SetGadgetItemText(#Gadget_List,r,User()\Password,4) Wend ;and of course, the loby room AddGadgetItem(#Gadget_List,-1,GetLocalISP()) r=CountGadgetItems(#Gadget_List)-1 SetGadgetItemText(#Gadget_List,r,"Main Loby",1) SetGadgetItemText(#Gadget_List,r,Str(CountList(User())),2) Default ;all data ;users data first ResetList(User()) r.l=0 While NextElement(User()) AddGadgetItem(#Gadget_List,-1,User()\Name) r=CountGadgetItems(#Gadget_List)-1 SetGadgetItemText(#Gadget_List,r,User()\RoomName,1) SetGadgetItemText(#Gadget_List,r,Str(User()\Status),2) SetGadgetItemText(#Gadget_List,r,User()\RegCode,3) SetGadgetItemText(#Gadget_List,r,User()\Password,4) Wend ;game rooms ResetList(Room()) While NextElement(Room()) AddGadgetItem(#Gadget_List,-1,Room()\UserISP) r=CountGadgetItems(#Gadget_List)-1 SetGadgetItemText(#Gadget_List,r,Room()\RoomName,1) SetGadgetItemText(#Gadget_List,r,Str(Room()\CPlayers)+"/"+Str(Room()\MPlayers),2) SetGadgetItemText(#Gadget_List,r,User()\RegCode,3) SetGadgetItemText(#Gadget_List,r,User()\Password,4) Wend ;and of course, the loby room AddGadgetItem(#Gadget_List,-1,GetLocalISP()) r=CountGadgetItems(#Gadget_List)-1 SetGadgetItemText(#Gadget_List,r,"Main Loby",1) SetGadgetItemText(#Gadget_List,r,Str(CountList(User())),2) ;and finally, the external servers ResetList(Server()) While NextElement(Server()) AddGadgetItem(#Gadget_List,-1,Server()\Name) r=CountGadgetItems(#Gadget_List)-1 SetGadgetItemText(#Gadget_List,r,Server()\RoomName,1) SetGadgetItemText(#Gadget_List,r,Str(Server()\CPlayers),2) SetGadgetItemText(#Gadget_List,r,Server()\UserISP,3) ;SetGadgetItemText(#Gadget_List,r,User()\Password,4) Wend ;and of course, this server... AddGadgetItem(#Gadget_List,-1,"Main Server") r=CountGadgetItems(#Gadget_List)-1 SetGadgetItemText(#Gadget_List,r,"Main Loby",1) SetGadgetItemText(#Gadget_List,r,Str(CountList(User())),2) SetGadgetItemText(#Gadget_List,r,GetLocalISP(),3) EndSelect EndProcedure ;-main loop Open_Server() scrollwindow_(GadgetID(#Gadget_3),-10,-15,0,0) AddGadgetColumn(#Gadget_List,1,"Room",100) AddGadgetColumn(#Gadget_List,2,"Status",100) AddGadgetColumn(#Gadget_List,3,"Game",100) AddGadgetColumn(#Gadget_List,4,"Password",100) MainPath=GetCurrentPath() GetMasterKey() #STest=1 CompilerIf #STest MainPath=PathRequester("Select a main path",MainPath) CompilerEndIf FullAdd.s=GetAdd(#Gadget_3) Timer.l=GetTickCount_() AddDelay.l=Timer+120000 Prep.l=#False PingDelay.l=Timer+60000 Repeat If GetTickCount_()>AddDelay AddDelay=GetTickCount_()+120000 FullAdd=GetAdd(#Gadget_3) If Online RelayMessage(Check+"E"+FullAdd,0,0,#False) EndIf EndIf If GetTickCount_()>PingDelay PingTest() PingDelay=GetTickCount_()+60000 FillList() EndIf If Online If Prep SetWindowText_(WindowID(),"Server Status - Shutting down in "+Str((Timer+300000-GetTickCount_())/1000)) CEvent.l=NetworkServerEvent() Else setwindowtext_(WindowID(),"Server Status - Online") CEvent.l=NetworkServerEvent() EndIf Else SetWindowText_(WindowID(),"Server Status - Offline") CEvent.l=0 EndIf Select CEvent Case 1 ;new client added AddElement(User()) User()\ID=NetworkClientID() User()\Time=GetTickCount_() User()\Status=0 AddGadgetItem(#Gadget_List,-1,"New User") User()\Posit=CountGadgetItems(#Gadget_List)-1 Case 2 ;recieve data If FindUserID(NetworkClientID())>-1 If GetServerData() ;data changes server display data SetGadgetItemText(#Gadget_list,User()\Posit,GetName(),0) SetGadgetItemText(#Gadget_list,User()\Posit,User()\RoomName,1) SetGadgetItemText(#Gadget_list,User()\Posit,Str(User()\Status),2) SetGadgetItemText(#Gadget_list,User()\Posit,User()\RegCode,3) SetGadgetItemText(#Gadget_list,User()\Posit,User()\RPass,4) EndIf EndIf Case 3 ;recieve file ;this is not used by this server Case 4 ;client left If FindUserID(NetworkClientID())>-1 ;inform all users that user left msg.s=Check+"R"+User()\Name+" has left the room" rid.l=User()\RoomID cid.l=User()\ID DeleteElement(User()) RelayMessage(msg,rid,cid,#True) FillList() EndIf EndSelect CEvent=0 Delay(1) WEvent.l=WindowEvent() If WEvent=#PB_Event_Menu MenuItem.l=EventMenuID() Select MenuItem Case #Menu_1 ;kick user cid.l=GetGadgetState(#Gadget_List) If cid>=0 msg.s=GetGadgetItemText(#Gadget_List,cid,0) FindUserName(msg) msg.s=Check+"R"+User()\Name+" has left the room" rid.l=User()\RoomID cid.l=User()\ID SendString(Check+"Y",User()\ID) CloseNetworkConnection(User()\ID) DeleteElement(User()) RelayMessage(msg,rid,cid,#True) FillList() EndIf Case #Menu_2 ;shutdown 5 min warning Timer=GetTickCount_() prep=#True ;also need to send a message to all users RelayMessage(Check+"Q Admin - Shutdown warning 5 minutes",0,0,#False) Case #Menu_3 ;shutdown, no warning If Online ;send a message to all users to exit RelayMessage(Check+"Y",0,0,#False) Online=#False Prep=#False CloseNetworkServer() EndIf Case #Menu_17 ;Start sserver If Online ;abort timed shutdown Prep=#False Else Online=#True Prep=#False If CreateNetworkServer(#Port)=#False Online=#False MyDebug("Main Loop","Start Server "+Str(#Port),"Port already in use") EndIf EndIf Case #Menu_4 ;full exit If Online ;send a message to all users to exit RelayMessage(Check+"Y",0,0,#False) Online=#False Prep=#False EndIf WEvent=#PB_EventCloseWindow CloseNetworkServer() Case #Menu_11 ;tool Admin RunProgram("admin.exe") Case #Menu_12 ;tool Chat client RunProgram("client.exe") Default ;sort stuff Uncheck() SetMenuItemState(#MenuBar_1,MenuItem,1) FillList() EndSelect EndIf If Prep If GetTickCount_()-Timer>300000 ;5 minutes up ;send message to all users to exit RelayMessage(Check+"Y",0,0,#False) Online=#False Prep=#False CloseNetworkServer() EndIf EndIf Delay(1) Until WEvent=#PB_EventCloseWindow If Online CloseNetworkServer() EndIf ; ExecutableFormat=Windows ; UseIcon=C:\Program Files\PureBasic\Projects\MyServer\NET13.ICO ; Executable=C:\Program Files\PureBasic\Projects\MyServer\server.exe ; EOF