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)); }
private MainMessage RoomListServer(ulong msgId, int serverId, RoomList roomList) { if (!_roomsPerServer.ContainsKey(serverId)) { _roomsPerServer[serverId] = new List <Room>(); } lock (_roomsPerServer[serverId]) { _roomsPerServer[serverId].Clear(); _roomsPerServer[serverId].AddRange(roomList.RoomList_.Select(x => new Room(x))); } roomList.RoomList_.AsParallel().ForAll(x => x.Players.AsParallel().ForAll(y => _user2Room[y] = x.RoomId)); return(ISystemService.CreateOkMessage(msgId)); }
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)); }
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); }
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)); } }