コード例 #1
0
        private MainMessage HandleListRoomUsers(MainMessage msg)
        {
            ulong?userId = _clientId2UserId[msg.ClientId];

            if (!userId.HasValue)
            {
                return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Unauthorized request."));
            }
            uint?roomId = _api.Services.Room.RoomByUserId(userId.Value);

            if (!roomId.HasValue)
            {
                return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "User must be connected to some Room."));
            }
            ulong[] users = _api.Services.Room.GetConnectedUsers(roomId.Value);
            if (users == null)
            {
                users = new ulong[0];
            }
            UserListMsg userListMsg = new UserListMsg();

            userListMsg.Users.AddRange(users.Select(x => User.Get(x)).Where(x => x != null).Select(x => x.ToMessage()));
            MainMessage response = new MainMessage();

            response.UserMngMsg                     = new UserMngMsg();
            response.UserMngMsg.UserMsg             = new UserMsg();
            response.UserMngMsg.UserMsg.UserListMsg = userListMsg;
            return(response);
        }
コード例 #2
0
        private MainMessage RoomEnter(ulong msgId, ulong clientId, RoomEnter roomEnter)
        {
            _log.Debug("In RoomEnter method.");
            int roomId = (int)roomEnter.RoomId;

            if (roomId >= _roomList.Count || _roomList[roomId] == null)
            {
                return(ISystemService.CreateErrorMessage(msgId, 0, 0, "There is no such room with this ID."));
            }
            lock (_roomList[roomId])
            {
                Room room = _roomList[roomId];
                if (room.Capacity <= room.Players.Count)
                {
                    return(ISystemService.CreateErrorMessage(msgId, 0, 0, "Room is full."));
                }
                ulong?userId = _api.Services.User.GetUserIdByClientId(clientId);
                if (!userId.HasValue)
                {
                    return(ISystemService.CreateErrorMessage(msgId, 0, 0, "Unable to match client ID to any user."));
                }
                room.Players.Add(userId.Value);
                room.LastActivity        = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                _user2Room[userId.Value] = (uint?)roomId;
                OnUserConnected(userId.Value, room.Id);
                _log.Info($"User with id '{userId.Value}' entered room '{room.Name}'.");
                MainMessage response = new MainMessage();
                response.RoomMsg            = new RoomMsg();
                response.RoomMsg.RoomDetail = room.ToNetworkModel();
                return(response);
            }
        }
コード例 #3
0
        private MainMessage RoomExit(ulong msgId, ulong clientId, RoomExit roomExit)
        {
            _log.Debug("In RoomExit method.");
            int   roomId = (int)roomExit.RoomId;
            ulong?userId = _api.Services.User.GetUserIdByClientId(clientId);

            if (!userId.HasValue || roomId >= _roomList.Count || _roomList[roomId] == null)
            {
                return(ISystemService.CreateErrorMessage(msgId, 0, 0, "Unable to match client ID to any user."));
            }
            lock (_roomList[roomId])
            {
                int idx = _roomList[roomId].Players.FindIndex(x => x == userId.Value);
                if (idx < 0)
                {
                    return(ISystemService.CreateErrorMessage(msgId, 0, 0, "Your client is not connected to this room."));
                }
                Room room = _roomList[roomId];
                room.Players.RemoveAt(idx);
                room.LastActivity = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                OnUserDisconnected(userId.Value, room.Id, "Disconnected");
                _user2Room[userId.Value] = null;
                _log.Info($"User with id '{userId.Value}' exited room '{room.Name}'.");
            }
            return(ISystemService.CreateOkMessage(msgId));
        }
コード例 #4
0
        public MainMessage HandleMessage(MainMessage msg)
        {
            AppMsg appMsg = msg.AppMsg;
            ulong  appId  = appMsg.AppId;

            if (!_appInstances.ContainsKey(appId))
            {
                return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "No handler could be found for this event."));
            }
            MainMessage response = new MainMessage();

            response.AppMsg       = new AppMsg();
            response.AppMsg.AppId = appId;
            byte[] data = appMsg.Data.ToByteArray();
            try
            {
                byte[] responseData = _appInstances[appId].HandleMessage(data, data.Length, new MsgContext(msg));
                if (responseData != null)
                {
                    response.AppMsg.Data = ByteString.CopyFrom(responseData);
                }
            }
            catch (Exception e)
            {
                _log.Error(e);
                return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, e.Message));
            }
            return(response);
        }
コード例 #5
0
        public MainMessage HandleMessage(MainMessage msg)
        {
            _log.Debug("In HandleMessage method.");
            RoomMsg roomMsg = msg.RoomMsg;

            switch (roomMsg.MessageTypeCase)
            {
            case RoomMsg.MessageTypeOneofCase.RoomCreate:
                return(RoomCreate(msg.MsgId, roomMsg.RoomCreate));

            case RoomMsg.MessageTypeOneofCase.RoomEnter:
                return(RoomEnter(msg.MsgId, msg.ClientId, roomMsg.RoomEnter));

            case RoomMsg.MessageTypeOneofCase.RoomExit:
                return(RoomExit(msg.MsgId, msg.ClientId, roomMsg.RoomExit));

            case RoomMsg.MessageTypeOneofCase.RoomQuery:
                switch (roomMsg.RoomQuery.RoomQueryCase)
                {
                case RoomQuery.RoomQueryOneofCase.RoomDetailId:
                    return(RoomDetail(roomMsg.RoomQuery.RoomDetailId));

                case RoomQuery.RoomQueryOneofCase.RoomListQuery:
                    return(RoomList(roomMsg.RoomQuery.RoomListQuery));

                default:
                    return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Invalid Operation."));
                }

            default:
                return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Invalid Operation."));
            }
        }
コード例 #6
0
 private MainMessage HandleServerMessage(MainMessage msg)
 {
     if (msg.ServerId != 0)
     {
         return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Forwarders cannot communicate with each other."));
     }
     return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Communication between provider and forwarder is not supported in UserService."));
 }
コード例 #7
0
        public MainMessage HandleMessage(MainMessage msg)
        {
            RoomMsg roomMsg  = msg.RoomMsg;
            int     serverId = 0;

            switch (roomMsg.MessageTypeCase)
            {
            case RoomMsg.MessageTypeOneofCase.RoomCreate:
                return(RoomCreate(msg.MsgId, msg.ClientId, msg));

            case RoomMsg.MessageTypeOneofCase.RoomDetail:
                return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Invalid message."));

            case RoomMsg.MessageTypeOneofCase.RoomEnter:
                serverId = _roomsPerServer.Where(x => x.Value.Find(y => y.Id == msg.RoomMsg.RoomEnter.RoomId) != null).FirstOrDefault().Key;
                if (serverId == 0)
                {
                    return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Room with this ID could not be found."));
                }
                return(ISystemService.CreateRedirectMessage(msg, _api.Services.System.GetAddressById((uint)serverId)));

            case RoomMsg.MessageTypeOneofCase.RoomExit:
                serverId = _roomsPerServer.Where(x => x.Value.Find(y => y.Id == msg.RoomMsg.RoomExit.RoomId) != null).FirstOrDefault().Key;
                if (serverId == 0)
                {
                    return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Room with this ID could not be found."));
                }
                return(ISystemService.CreateRedirectMessage(msg, _api.Services.System.GetAddressById((uint)serverId)));

            case RoomMsg.MessageTypeOneofCase.RoomList:
                if (msg.SenderIdCase == MainMessage.SenderIdOneofCase.ClientId)
                {
                    return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Invalid message."));
                }
                return(RoomListServer(msg.MsgId, (int)msg.ServerId, msg.RoomMsg.RoomList));

            case RoomMsg.MessageTypeOneofCase.RoomQuery:
                switch (msg.RoomMsg.RoomQuery.RoomQueryCase)
                {
                case RoomQuery.RoomQueryOneofCase.RoomDetailId:
                    return(RoomDetail(msg.MsgId, msg.RoomMsg.RoomQuery.RoomDetailId));

                case RoomQuery.RoomQueryOneofCase.RoomListQuery:
                    return(RoomListClient(msg.RoomMsg.RoomQuery.RoomListQuery));

                default:
                    return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Invalid message."));
                }

            default:
                return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Invalid message."));
            }
        }
コード例 #8
0
        private MainMessage HandleUserMsg(MainMessage msg)
        {
            UserMsg userMsg = msg.UserMngMsg.UserMsg;

            switch (userMsg.UserMsgTypeCase)
            {
            case UserMsg.UserMsgTypeOneofCase.UserRequestMsg:
                return(HandleUserRequest(msg));

            default:
                return(ISystemService.CreateErrorMessage(0, 0, 0,
                                                         this.GetType().Name + ": Cannot handle this type of message."));
            }
        }
コード例 #9
0
        public MainMessage HandleMessage(MainMessage msg)
        {
            SystemMsg sysMsg = msg.SystemMsg;

            switch (sysMsg.SystemMsgTypeCase)
            {
            case SystemMsg.SystemMsgTypeOneofCase.HiMsg:
                return(HandleHiMsg(sysMsg.HiMsg));

            case SystemMsg.SystemMsgTypeOneofCase.StatMsg:
                return(HandleStatMsg(msg));

            default:
                return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Unknown message type"));
            }
        }
コード例 #10
0
        public MainMessage HandleMessage(MainMessage msg)
        {
            Stopwatch sw = new Stopwatch();

            sw.Start();
            EventDataMsg  eventMsg = msg.EventMsg.EventDataMsg;
            EventResponse response = new EventResponse();

            if (eventMsg == null)
            {
                return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Forwarder can process only EventDataMsg type."));
            }
            if (eventMsg.AppTypeCase != EventDataMsg.AppTypeOneofCase.None)
            {
                try
                {
                    byte[] responseData = _api.Services.App.HandleEvent(msg);
                    if (responseData != null)
                    {
                        response.Data = ByteString.CopyFrom(responseData);
                    }
                }
                catch (EventErrorException e)
                {
                    _log.Error(e);
                    response = IEventService.CreateErrorResponse(msg.MsgId, 0, 0, e.Message);
                }
            }
            else
            {
                EventResponse handleResponse = HandleEvent(msg);
                if (handleResponse != null)
                {
                    response = handleResponse;
                }
            }

            response.ProcessTime = (uint)sw.ElapsedMilliseconds;
            response             = _maskHandler.Handle(msg.ClientId, eventMsg, response);

            MainMessage responseMsg = new MainMessage();

            responseMsg.EventMsg = new EventMsg();
            responseMsg.EventMsg.EventResponse = response;
            return(responseMsg);
        }
コード例 #11
0
        private MainMessage HandleStatMsg(MainMessage msg)
        {
            _log.Debug("In HandleStatMsg method");
            uint serverId = msg.ServerId;

            if (serverId >= computingServers.Count)
            {
                _log.Error("Unknown Computing Server.");
                return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Unknown Computing Server."));
            }
            StatMsg statMsg = msg.SystemMsg.StatMsg;

            computingServers[(int)serverId].cpuUsage     = statMsg.CpuUsage;
            computingServers[(int)serverId].ramUsage     = statMsg.MemoryUsed;
            computingServers[(int)serverId].lastResponse = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
            _log.Debug($"server {serverId} status: CPU: {statMsg.CpuUsage}%, RAM: {statMsg.MemoryUsed} MB");
            return(ISystemService.CreateOkMessage((uint)msg.MsgId));
        }
コード例 #12
0
        private MainMessage HandleHiMsg(HiMsg msg)
        {
            this._log.Debug("Received Hi message.");
            if (msg.Version != VrLifeServer.VERSION)
            {
                this._log.Debug("Not compatiable version of client.");
                return(ISystemService.CreateErrorMessage(0, 0, 0, "Not compatiable version"));
            }
            MainMessage response = ISystemService.CreateOkMessage();

            response.ServerId = (uint)computingServers.Count;
            this._log.Debug($"Sending {response.ServerId} as a new ServerID.");
            computingServers.Add(
                new ComputingServer {
                id           = response.ServerId, cores = msg.Threads,
                memory       = msg.Memory, address = new IPEndPoint(msg.Address, msg.Port),
                lastResponse = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
            });
            return(response);
        }
コード例 #13
0
        private MainMessage HandleAuthMsg(MainMessage msg)
        {
            _log.Debug("Received authorization message.");
            AuthMsg authMsg  = msg.UserMngMsg.AuthMsg;
            string  username = authMsg.Username;
            string  password = authMsg.Password;

            User user = User.Get(username);

            if (user == null)
            {
                _log.Debug("Could not find user with this username.");
                return(ISystemService.CreateErrorMessage(0, 0, 0,
                                                         "Could not find user with this username."));
            }
            if (!user.CheckPassword(password))
            {
                _log.Debug("Invalid password.");
                return(ISystemService.CreateErrorMessage(0, 0, 0,
                                                         "Invalid password."));
            }
            MainMessage response = new MainMessage();

            response.UserMngMsg         = new UserMngMsg();
            response.UserMngMsg.UserMsg = new UserMsg();
            response.UserMngMsg.UserMsg.UserDetailMsg          = user.ToMessage();
            response.UserMngMsg.UserMsg.UserDetailMsg.Password = "";

            // clientId == 0 --> unsassigned ID
            if (msg.ClientId != 0 && msg.ClientId < (ulong)_clientMachines.Count)
            {
                _clientMachines[(int)msg.ClientId] = user;
                response.ClientId = msg.ClientId;
            }
            else
            {
                response.ClientId = (uint)_clientMachines.Count;
                _clientMachines.Add(user);
            }
            return(response);
        }
コード例 #14
0
        public MainMessage HandleMessage(MainMessage msg)
        {
            EventDataMsg dataMsg = msg.EventMsg.EventDataMsg;

            if (dataMsg == null)
            {
                return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Invalid msg type."));
            }

            EventResponse response;

            if (msg.EventMsg.EventDataMsg.AppTypeCase != EventDataMsg.AppTypeOneofCase.None)
            {
                try
                {
                    response = new EventResponse();
                    byte[] responseData = _api.Services.App.HandleEvent(msg);
                    if (responseData != null)
                    {
                        response.Data = ByteString.CopyFrom(responseData);
                    }
                }
                catch (EventErrorException e)
                {
                    _log.Error(e);
                    response = IEventService.CreateErrorResponse(msg.MsgId, 0, 0, e.Message);
                }
            }
            else
            {
                const string err_msg = "Main server does not handle events of this type.";
                _log.Error(err_msg);
                response = IEventService.CreateErrorResponse(msg.MsgId, 0, 0, err_msg);
            }
            response = _maskHandler.Handle(msg.ClientId, dataMsg, response);
            MainMessage responseMsg = new MainMessage();

            responseMsg.EventMsg = new EventMsg();
            responseMsg.EventMsg.EventResponse = response;
            return(responseMsg);
        }
コード例 #15
0
        private MainMessage RoomDetail(ulong msgId, uint roomId)
        {
            Room room = null;

            foreach (List <Room> rooms in _roomsPerServer.Values)
            {
                room = rooms.Find(x => x.Id == roomId);
                if (room != null)
                {
                    break;
                }
            }
            if (room == null)
            {
                return(ISystemService.CreateErrorMessage(msgId, 0, 0, "Room with this ID could not be found."));
            }
            MainMessage msg = new MainMessage();

            msg.RoomMsg            = new RoomMsg();
            msg.RoomMsg.RoomDetail = room.ToNetworkModel();
            return(msg);
        }
コード例 #16
0
        public MainMessage HandleMessage(MainMessage msg)
        {
            AppMsg appMsg = msg.AppMsg;
            ulong? userId = _api.Services.User.GetUserIdByClientId(msg.ClientId, true);

            if (!userId.HasValue)
            {
                return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Unauthenticated user."));
            }
            uint?roomId = _api.Services.Room.RoomByUserId(userId.Value);

            if (!roomId.HasValue)
            {
                return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "User is not connected to any room."));
            }
            ulong appId = appMsg.AppId;

            if (!_appInstances.ContainsKey(roomId.Value) || !_appInstances[roomId.Value].ContainsKey(appId))
            {
                return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "No handler could be found for this event."));
            }
            MainMessage response = new MainMessage();

            response.AppMsg       = new AppMsg();
            response.AppMsg.AppId = appId;
            byte[] data = appMsg.Data.ToByteArray();
            try
            {
                response.AppMsg.Data = ByteString.CopyFrom(
                    _appInstances[roomId.Value][appId].HandleMessage(data, data.Length, new MsgContext(msg))
                    );
            }
            catch (Exception e)
            {
                return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, e.Message));
            }
            return(response);
        }
コード例 #17
0
        private MainMessage RoomCreate(ulong msgId, ulong clientId, MainMessage msg)
        {
            if (_roomsPerServer.Count == 0)
            {
                return(ISystemService.CreateErrorMessage(msgId, 0, 0, "There is currently no computing server."));
            }
            int serverId = 1;

            foreach (KeyValuePair <int, List <Room> > pair in _roomsPerServer)
            {
                lock (_roomsPerServer[pair.Key])
                {
                    if (_api.Services.System.IsAlive((ulong)pair.Key) && pair.Value.Count < _roomsPerServer[serverId].Count)
                    {
                        serverId = pair.Key;
                    }
                }
            }

            IPEndPoint redirect = _api.Services.System.GetAddressById((uint)serverId);

            return(ISystemService.CreateRedirectMessage(msg, redirect));
        }
コード例 #18
0
        private MainMessage HandleUserRequest(MainMessage msg)
        {
            _log.Debug("In HandleUserRequest method.");
            try
            {
                // TODO needs enhancemnets
                UserRequestMsg userRequest = msg.UserMngMsg.UserMsg.UserRequestMsg;
                switch (userRequest.UserRequestTypeCase)
                {
                // create new User
                case UserRequestMsg.UserRequestTypeOneofCase.CreateQuery:
                    _log.Debug("Creating new user: "******"User sucessfuly created.");
                    return(new MainMessage {
                        UserMngMsg = userMngMsg
                    });

                // List users (Username LIKE '%msg.username%')
                case UserRequestMsg.UserRequestTypeOneofCase.ListQuery:
                    _log.Debug("Looking for user like: " + userRequest.ListQuery.Username);
                    UserDetailMsg   userDetail = userRequest.ListQuery;
                    UserDetailMsg[] users      = User.List(userDetail)
                                                 .Select(x => new UserDetailMsg {
                        Password = "", UserId = x.Id, Username = x.Username
                    })
                                                 .ToArray();
                    UserListMsg userList = new UserListMsg();
                    userList.Users.AddRange(users);
                    UserMngMsg userMngMsg1 = new UserMngMsg();
                    userMngMsg1.UserMsg = new UserMsg {
                        UserListMsg = userList
                    };
                    _log.Debug($"Found {users.Length} records.");
                    return(new MainMessage {
                        UserMngMsg = userMngMsg1
                    });

                // Change password, where old and new password are in same filed, separated by newline
                case UserRequestMsg.UserRequestTypeOneofCase.UpdateQuery:
                    _log.Debug("Changing password to user: "******"Password sucessfuly changed.");
                    return(ISystemService.CreateOkMessage(msg.MsgId));

                // show user by its Id
                case UserRequestMsg.UserRequestTypeOneofCase.UserIdDetail:
                    _log.Debug($"Looking for user with id {userRequest.UserIdDetail}");
                    User          user2       = User.Get(userRequest.UserIdDetail);
                    UserDetailMsg userDetail1 = new UserDetailMsg();
                    userDetail1.UserId   = user2.Id;
                    userDetail1.Password = "";
                    userDetail1.Username = user2.Username;
                    UserMsg userMsg1 = new UserMsg();
                    userMsg1.UserDetailMsg = userDetail1;
                    return(new MainMessage {
                        UserMngMsg = new UserMngMsg {
                            UserMsg = userMsg1
                        }
                    });

                case UserRequestMsg.UserRequestTypeOneofCase.UserByClientId:
                    _log.Debug($"Looking for user with client id {userRequest.UserByClientId}");
                    if (msg.SenderIdCase != MainMessage.SenderIdOneofCase.ServerId)
                    {
                        return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Not enough permissions."));
                    }
                    ulong clientId = userRequest.UserByClientId;
                    if (clientId >= (ulong)_clientMachines.Count || _clientMachines[(int)clientId] == null)
                    {
                        return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Unable to find user with this client ID"));
                    }
                    MainMessage respUserDetail = new MainMessage();
                    respUserDetail.UserMngMsg         = new UserMngMsg();
                    respUserDetail.UserMngMsg.UserMsg = new UserMsg();
                    respUserDetail.UserMngMsg.UserMsg.UserDetailMsg = _clientMachines[(int)clientId].ToMessage();
                    return(respUserDetail);

                default:
                    throw new ErrorMsgException("This message cannot be empty.");
                }
            }
            catch (Exception ex)
            {
                _log.Error(ex);
                return(ISystemService.CreateErrorMessage(0, 0, 0, ex.Message));
            }
        }
コード例 #19
0
 public MainMessage HandleMessage(MainMessage msg)
 {
     return(ISystemService.CreateErrorMessage(msg.MsgId, 0, 0, "Provider cannot receive TickRateMsg."));
 }