VERSION 5.00 Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "MSCOMCTL.OCX" Begin VB.Form frmServer BorderStyle = 3 'Fixed Dialog Caption = "vbMessenger Server" ClientHeight = 4515 ClientLeft = 45 ClientTop = 330 ClientWidth = 3645 Icon = "frmServer.frx":0000 LinkTopic = "Form1" MaxButton = 0 'False MinButton = 0 'False ScaleHeight = 4515 ScaleWidth = 3645 StartUpPosition = 3 'Windows Default Begin VB.Timer tmrSaveXML Interval = 60000 Left = 3660 Top = 1410 End Begin VB.Timer tmrLogon Interval = 50 Left = 3660 Top = 960 End Begin VB.Timer tmrLogoff Interval = 50 Left = 3660 Top = 480 End Begin VB.ListBox lstUsers Height = 3765 Left = 60 TabIndex = 1 Top = 360 Width = 3495 End Begin MSComctlLib.StatusBar sBar Align = 2 'Align Bottom Height = 375 Left = 0 TabIndex = 0 Top = 4140 Width = 3645 _ExtentX = 6429 _ExtentY = 661 Style = 1 SimpleText = " " _Version = 393216 BeginProperty Panels {8E3867A5-8586-11D1-B16A-00C0F0283628} NumPanels = 1 BeginProperty Panel1 {8E3867AB-8586-11D1-B16A-00C0F0283628} EndProperty EndProperty End Begin VB.Label Label1 BackStyle = 0 'Transparent Caption = "Users currently in this session" Height = 255 Left = 60 TabIndex = 2 Top = 60 Width = 3495 End Begin VB.Menu mnuPop Caption = "PopUp" Visible = 0 'False Begin VB.Menu mnuShow Caption = "Show" End Begin VB.Menu mnuSep Caption = "-" End Begin VB.Menu mnuExit Caption = "Exit" End End End Attribute VB_Name = "frmServer" Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = True Attribute VB_Exposed = False Option Explicit ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' ' Copyright (C) 1999-2001 Microsoft Corporation. All Rights Reserved. ' ' File: frmServer.frm ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Implements DirectPlay8Event Private mfExit As Boolean Private mfLogoffTimer As Boolean Private msLogoffName As String Private mfLogonTimer As Boolean Private msLogonName As String Private Sub StartServer() Dim appdesc As DPN_APPLICATION_DESC 'Now set up the app description With appdesc .guidApplication = AppGuid .lMaxPlayers = 1000 'This seems like a nice round number .SessionName = "vbMessengerServer" .lFlags = DPNSESSION_CLIENT_SERVER Or DPNSESSION_NODPNSVR 'We must pass the client server flags if we are a server End With 'Now set up our address value dpa.SetSP DP8SP_TCPIP dpa.AddComponentLong DPN_KEY_PORT, glDefaultPort 'Use a specific port 'Now start the server dps.Host appdesc, dpa UpdateText "Server running... (" & CStr(glNumPlayers) & "/1000 clients connected.)" End Sub Private Sub Form_Load() dps.RegisterMessageHandler Me 'Lets put an icon in the system tray With sysIcon .cbSize = LenB(sysIcon) .hwnd = Me.hwnd .uFlags = NIF_DOALL .uCallbackMessage = WM_MOUSEMOVE .hIcon = Me.Icon .sTip = "Server running... (" & CStr(glNumPlayers) & "/1000 clients connected.)" & vbNullChar End With Shell_NotifyIcon NIM_ADD, sysIcon 'Open the database OpenClientDatabase 'Start the server StartServer End Sub Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Dim ShellMsg As Long ShellMsg = X / Screen.TwipsPerPixelX Select Case ShellMsg Case WM_LBUTTONDBLCLK mnuShow_Click Case WM_RBUTTONUP 'Show the menu PopupMenu mnuPop, , , , mnuShow End Select End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) If Not mfExit Then Cancel = 1 Me.Hide End If End Sub Private Sub Form_Unload(Cancel As Integer) 'Remove the icon from the system tray Shell_NotifyIcon NIM_DELETE, sysIcon 'Close the database CloseDownDB 'Cleanup the dplay objects Cleanup End Sub Private Sub mnuExit_Click() mfExit = True Unload Me End Sub Private Sub mnuShow_Click() Me.Visible = True Me.SetFocus End Sub Private Sub tmrSaveXML_Timer() Static lCount As Long 'Every 5 minutes we will save the xml lCount = lCount + 1 If lCount >= 5 Then lCount = 0 SaveXMLStructure End If End Sub Private Sub UpdateText(sNewText As String) sBar.SimpleText = sNewText 'modify our icon text sysIcon.sTip = sNewText & vbNullChar sysIcon.uFlags = NIF_TIP Shell_NotifyIcon NIM_MODIFY, sysIcon End Sub Private Sub tmrLogoff_Timer() 'Log this user off If mfLogoffTimer Then NotifyFriends msLogoffName, Msg_FriendLogoff End If msLogoffName = vbNullString mfLogoffTimer = False End Sub Private Sub tmrLogon_Timer() If mfLogonTimer Then mfLogonTimer = False NotifyFriends msLogonName, Msg_FriendLogon 'Tell everyone who has me marked as a friend that I'm online GetFriendsOfMineOnline msLogonName 'Find out if any of my friends are online and tell me End If msLogonName = vbNullString End Sub Private Sub DirectPlay8Event_AddRemovePlayerGroup(ByVal lMsgID As Long, ByVal lPlayerID As Long, ByVal lGroupID As Long, fRejectMsg As Boolean) 'VB requires that we must implement *every* member of this interface End Sub Private Sub DirectPlay8Event_AppDesc(fRejectMsg As Boolean) 'VB requires that we must implement *every* member of this interface End Sub Private Sub DirectPlay8Event_AsyncOpComplete(dpnotify As DxVBLibA.DPNMSG_ASYNC_OP_COMPLETE, fRejectMsg As Boolean) 'VB requires that we must implement *every* member of this interface End Sub Private Sub DirectPlay8Event_ConnectComplete(dpnotify As DxVBLibA.DPNMSG_CONNECT_COMPLETE, fRejectMsg As Boolean) 'VB requires that we must implement *every* member of this interface End Sub Private Sub DirectPlay8Event_CreateGroup(ByVal lGroupID As Long, ByVal lOwnerID As Long, fRejectMsg As Boolean) 'VB requires that we must implement *every* member of this interface End Sub Private Sub DirectPlay8Event_CreatePlayer(ByVal lPlayerID As Long, fRejectMsg As Boolean) 'VB requires that we must implement *every* member of this interface End Sub Private Sub DirectPlay8Event_DestroyGroup(ByVal lGroupID As Long, ByVal lReason As Long, fRejectMsg As Boolean) 'VB requires that we must implement *every* member of this interface End Sub Private Sub DirectPlay8Event_DestroyPlayer(ByVal lPlayerID As Long, ByVal lReason As Long, fRejectMsg As Boolean) Dim lCount As Long On Local Error GoTo ErrOut 'So we don't get an InvalidPlayer error when checking on the host 'Update the DB to show a logoff UpdateDBToShowLogoff lPlayerID 'Remove this player from our listbox For lCount = lstUsers.ListCount - 1 To 0 Step -1 If lstUsers.ItemData(lCount) = lPlayerID Then mfLogoffTimer = True msLogoffName = lstUsers.List(lCount) glNumPlayers = glNumPlayers - 1 lstUsers.RemoveItem lCount Exit For End If Next ErrOut: UpdateText "Server running... (" & CStr(glNumPlayers) & "/1000 clients connected.)" End Sub Private Sub DirectPlay8Event_EnumHostsQuery(dpnotify As DxVBLibA.DPNMSG_ENUM_HOSTS_QUERY, fRejectMsg As Boolean) 'VB requires that we must implement *every* member of this interface End Sub Private Sub DirectPlay8Event_EnumHostsResponse(dpnotify As DxVBLibA.DPNMSG_ENUM_HOSTS_RESPONSE, fRejectMsg As Boolean) 'VB requires that we must implement *every* member of this interface End Sub Private Sub DirectPlay8Event_HostMigrate(ByVal lNewHostID As Long, fRejectMsg As Boolean) 'VB requires that we must implement *every* member of this interface End Sub Private Sub DirectPlay8Event_IndicateConnect(dpnotify As DxVBLibA.DPNMSG_INDICATE_CONNECT, fRejectMsg As Boolean) 'VB requires that we must implement *every* member of this interface End Sub Private Sub DirectPlay8Event_IndicatedConnectAborted(fRejectMsg As Boolean) 'VB requires that we must implement *every* member of this interface End Sub Private Sub DirectPlay8Event_InfoNotify(ByVal lMsgID As Long, ByVal lNotifyID As Long, fRejectMsg As Boolean) 'VB requires that we must implement *every* member of this interface End Sub Private Sub DirectPlay8Event_Receive(dpnotify As DxVBLibA.DPNMSG_RECEIVE, fRejectMsg As Boolean) 'We need to get each message we receive from a client, process it, and respond accordingly Dim lMsg As Long, lOffset As Long Dim oNewMsg() As Byte, lNewOffSet As Long Dim sUserName As String, sPass As String Dim lNewMsg As Long, fLoggedin As Boolean Dim sChatMsg As String, sFromMsg As String With dpnotify GetDataFromBuffer .ReceivedData, lMsg, LenB(lMsg), lOffset Select Case lMsg 'The server will only receive certain messages. Handle those. Case Msg_AddFriend 'They want to add a friend to their list sUserName = GetStringFromBuffer(.ReceivedData, lOffset) If Not DoesUserExist(sUserName) Then 'This user does not exist, notify the person that they cannot be added lNewMsg = Msg_FriendDoesNotExist lNewOffSet = NewBuffer(oNewMsg) AddDataToBuffer oNewMsg, lNewMsg, LenB(lNewMsg), lNewOffSet dps.SendTo .idSender, oNewMsg, 0, 0 Else 'Great, add this user to our friend list fLoggedin = AddFriend(.idSender, sUserName, True) lNewMsg = Msg_FriendAdded lNewOffSet = NewBuffer(oNewMsg) AddDataToBuffer oNewMsg, lNewMsg, LenB(lNewMsg), lNewOffSet AddStringToBuffer oNewMsg, sUserName, lNewOffSet dps.SendTo .idSender, oNewMsg, 0, DPNSEND_SYNC If fLoggedin Then lNewMsg = Msg_FriendLogon lNewOffSet = NewBuffer(oNewMsg) AddDataToBuffer oNewMsg, lNewMsg, LenB(lMsg), lNewOffSet AddStringToBuffer oNewMsg, sUserName, lNewOffSet dps.SendTo .idSender, oNewMsg, 0, 0 End If End If Case Msg_BlockFriend 'They want to block a friend from their list sUserName = GetStringFromBuffer(.ReceivedData, lOffset) If Not DoesUserExist(sUserName) Then 'This user does not exist, notify the person that they cannot be blocked lNewMsg = Msg_BlockUserDoesNotExist lNewOffSet = NewBuffer(oNewMsg) AddDataToBuffer oNewMsg, lNewMsg, LenB(lNewMsg), lNewOffSet dps.SendTo .idSender, oNewMsg, 0, 0 Else 'Great, block this user in our friend list AddFriend .idSender, sUserName, False lNewMsg = Msg_FriendBlocked lNewOffSet = NewBuffer(oNewMsg) AddDataToBuffer oNewMsg, lNewMsg, LenB(lNewMsg), lNewOffSet AddStringToBuffer oNewMsg, sUserName, lNewOffSet dps.SendTo .idSender, oNewMsg, 0, 0 End If Case Msg_CreateNewAccount 'They want to create a new account sUserName = GetStringFromBuffer(.ReceivedData, lOffset) sPass = GetStringFromBuffer(.ReceivedData, lOffset) If DoesUserExist(sUserName) Then 'This user already exists, inform the person so they can try a new name lNewMsg = Msg_UserAlreadyExists lNewOffSet = NewBuffer(oNewMsg) AddDataToBuffer oNewMsg, lNewMsg, LenB(lNewMsg), lNewOffSet dps.SendTo .idSender, oNewMsg, 0, 0 Else 'Great, this username doesn't exist. Now lets add this user AddUser sUserName, sPass, .idSender 'We don't need to inform anyone we are logged on, because 'no one could have us listed as a friend yet 'Notify the user they logged on successfully lNewMsg = Msg_LoginSuccess lNewOffSet = NewBuffer(oNewMsg) AddDataToBuffer oNewMsg, lNewMsg, LenB(lNewMsg), lNewOffSet dps.SendTo .idSender, oNewMsg, 0, 0 'Increment our user count glNumPlayers = glNumPlayers + 1 'Add this user to our list of users currently online lstUsers.AddItem sUserName & " 0x" & Hex$(.idSender) lstUsers.ItemData(lstUsers.ListCount - 1) = .idSender UpdateText "Server running... (" & CStr(glNumPlayers) & "/1000 clients connected.)" End If Case Msg_Login 'They have requested a login, check name/password sUserName = GetStringFromBuffer(.ReceivedData, lOffset) sPass = GetStringFromBuffer(.ReceivedData, lOffset) Select Case LogonUser(sUserName, sPass) 'Try to log on the user Case LogonSuccess 'Great, they logged on UpdateDBToShowLogon sUserName, dpnotify.idSender 'Update the DB to show I'm online 'Notify the user they logged on successfully lNewMsg = Msg_LoginSuccess lNewOffSet = NewBuffer(oNewMsg) AddDataToBuffer oNewMsg, lNewMsg, LenB(lNewMsg), lNewOffSet dps.SendTo .idSender, oNewMsg, 0, 0 mfLogonTimer = True msLogonName = sUserName 'Increment our user count glNumPlayers = glNumPlayers + 1 'Add this user to our list of users currently online lstUsers.AddItem sUserName & " 0x" & Hex$(.idSender) lstUsers.ItemData(lstUsers.ListCount - 1) = .idSender UpdateText "Server running... (" & CStr(glNumPlayers) & "/1000 clients connected.)" Case InvalidPassword 'Let the user know that they didn't type in the right password 'Notify the user they sent the wrong password lNewMsg = Msg_InvalidPassword lNewOffSet = NewBuffer(oNewMsg) AddDataToBuffer oNewMsg, lNewMsg, LenB(lNewMsg), lNewOffSet dps.SendTo .idSender, oNewMsg, 0, 0 Case AccountDoesNotExist 'Let the user know this account isn't in the DB 'Notify the user that this account doesn't exist lNewMsg = Msg_InvalidUser lNewOffSet = NewBuffer(oNewMsg) AddDataToBuffer oNewMsg, lNewMsg, LenB(lNewMsg), lNewOffSet dps.SendTo .idSender, oNewMsg, 0, 0 End Select Case Msg_SendMessage 'They are trying to send a message to someone sUserName = GetStringFromBuffer(.ReceivedData, lOffset) sFromMsg = GetStringFromBuffer(.ReceivedData, lOffset) sChatMsg = GetStringFromBuffer(.ReceivedData, lOffset) SendMessage sUserName, sFromMsg, sChatMsg End Select End With End Sub Private Sub DirectPlay8Event_SendComplete(dpnotify As DxVBLibA.DPNMSG_SEND_COMPLETE, fRejectMsg As Boolean) 'VB requires that we must implement *every* member of this interface End Sub Private Sub DirectPlay8Event_TerminateSession(dpnotify As DxVBLibA.DPNMSG_TERMINATE_SESSION, fRejectMsg As Boolean) 'VB requires that we must implement *every* member of this interface End Sub