Beispiel #1
0
        /**
         * ADMIN ONLY
         * Merges a dictionary of objects into the store
         * TODO: check that the client is an admin
         * */
        /*
         * public void Merge(MClient c, MNetMessage m)
         * {
         * Dictionary<string, MServerObject> Results = null;
         * try
         * {
         * Results = JsonConvert.DeserializeObject<Dictionary<string, MServerObject>>(m.Payload);
         * }
         * catch (Exception e)
         * {
         * MNetMessage mr = new MNetMessage(1, "SERVER", MNetMessage.MERGE, "FAILED: " + e.Message);
         * Send(c, "Message", mr.Serialize());
         * }
         * finally
         * {
         * if (Results != null)
         * {
         *   foreach (KeyValuePair<string, MServerObject> kv in Results)
         *   {
         *     AddToWorld(kv.Value);
         *   }
         * }
         * MNetMessage mr = new MNetMessage(1, "SERVER", MNetMessage.MERGE, "SUCCESS");
         * Send(c, "Message", mr.Serialize());
         * }
         * }
         */

        public void ConnectToMASSIVE(MClient c, MNetMessage m)
        {
            c.State = MClient.STATE_CONNECTOWORLD;
            MNetMessage mr = new MNetMessage();

            mr.Command = MNetMessage.CONNECTTOMASSIVE;
            mr.UserID  = c.Account.UserID;
            Send(c, "Message", mr.Serialize());

            ClientConnected?.Invoke(this, new ServerEvent("Connected to MASSIVE:" + c.ToString()));
        }
Beispiel #2
0
        //log in registered player
        //player sends updatedetails message to register
        public void LoginRequest(MClient c, MNetMessage m)
        {
            if (MassiveConnections.Count >= MAXCONNECTIONS)
            {
                DisconnectClient(c.connection, "Maximum Connections exceded");
                return;
            }

            MLoginMessageRequest mlir = MLoginMessageRequest.Deserialize <MLoginMessageRequest>(m.Payload);
            //check database
            //if password matches, continue
            //if not, send failed message
            IPEndPoint ipe = (IPEndPoint)c.connection.ConnectionInfo.RemoteEndPoint;
            string     s   = ipe.Address + ":" + ipe.Port;

            c.Account.ClientIP = s;
            if (c.Account.UserID == null)
            {
                c.Account.UserID = m.UserID;
            }
            _DataBase.UpdatePlayerIP(c.Account);
            _DataBase.UpdatePlayerUsage(c.Account);

            MUserAccount mu = _DataBase.GetPlayerByEmail(mlir.Email, mlir.Password);

            if (mu == null)
            {
                MNetMessage mli = new MNetMessage();
                mli.Command = MNetMessage.ERROR;
                mli.Payload = "User not found. Building Disabled. Register User and Login again.";
                Send(c, "Message", mli.Serialize());
            }
            else
            {
                MNetMessage mli = new MNetMessage();
                mli.Command = MNetMessage.LOGIN;
                mli.UserID  = mu.UserID;
                mli.Payload = mu.Serialize();
                Send(c, "Message", mli.Serialize());
                c.Account = mu;
            }

            ClientLoggedIn?.Invoke(this, new ServerEvent("Logged In:" + c.ToString()));
        }
Beispiel #3
0
        private void HandleConnection(Connection connection)
        {
            IPEndPoint ipe = (IPEndPoint)connection.ConnectionInfo.RemoteEndPoint;
            //string s = connection.ConnectionInfo.RemoteIPEndPoint.Address + ":" + connection.ConnectionInfo.RemoteIPEndPoint.Port;
            string s = ipe.Address + ":" + ipe.Port;

            if ((ipe.Address.ToString() == ServerIPAddress) &&
                (ipe.Port == ServerPort))
            {
                return;
            }

            MClient c = new MClient();

            c.State            = MClient.STATE_CONNECTING;
            c.connection       = connection;
            c.Address          = ipe.Address;
            c.Port             = ipe.Port;
            c.Account.ClientIP = ipe.Address.ToString();
            MassiveConnections.Add(c);

            if (ClientConnected != null)
            {
                ServerEvent se = new ServerEvent("CONNECTED");
                se.Client = c;
                ClientConnected(this, se);
            }

            Log("Connected:" + c.ToString(), UTILITY);

            MNetMessage m     = new MNetMessage();
            int         Count = MassiveConnections.Count;

            if (Count < MAXCONNECTIONS)
            {
                m.Command = MNetMessage.READY;
                m.UserID  = MNetMessage.SERVER;
                Send(c, "Message", m.Serialize());
            }
            else
            {
                DisconnectClient(connection, "Maximum Connections Reached. Please try a different server, or come back later.");
            }
        }
Beispiel #4
0
        private void HandleConnectionClosed(Connection connection)
        {
            //IPEndPoint ipe = (IPEndPoint)connection.ConnectionInfo.RemoteEndPoint;
            //string s = ipe.Address + ":" + ipe.Port;

            MClient ToRemove = null;

            foreach (MClient m in MassiveConnections)
            {
                if (m.connection == connection)
                {
                    ToRemove = m;
                }
            }

            _DataBase.RemoveUserFromUniverse(ToRemove.Account.UserID);
            //CurrentUniverse.Cleanup(ToRemove.Account.UserID);

            if (ToRemove != null)
            {
                ToRemove.Account.LastActivity = DateTime.Now;
                ToRemove.Save();
                MassiveConnections.Remove(ToRemove);
            }

            if (ClientDisconnected != null)
            {
                ServerEvent se = new ServerEvent("DISCONNECTED");
                ClientDisconnected(this, se);
            }

            MNetMessage mn = new MNetMessage();

            mn.Command = MNetMessage.LOGGEDOUT;
            mn.UserID  = ToRemove.Account.UserID;
            SendToAllClients(ToRemove, mn.Serialize());

            Log("Disconnected:" + ToRemove.ToString(), UTILITY);
        }