public DC.Responses.PlayerIdentifier PlayerLogin(DC.Requests.PlayerLoginRequest request)
        {
            string
                emailAddress = request.EmailAddress,
                password = request.Password;
            // I know, catching Exceptions is not "best practice" for data validation,
            // but this is an easy way to avoid Regex (for now)
            try
            {
                var m = new MailAddress(emailAddress);
            }
            catch (FormatException)
            {
                return null;
            }

            // If we've made it past the validation, it's safe to brute-force parse the email address
            string userName, domainName, domain;

            int atIndex = emailAddress.IndexOf('@');

            userName = emailAddress.Substring(0, atIndex);

            emailAddress = emailAddress.Remove(0, atIndex + 1);

            int periodIndex = emailAddress.LastIndexOf('.');

            domainName = emailAddress.Substring(0, periodIndex);

            emailAddress = emailAddress.Remove(0, periodIndex + 1);

            domain = emailAddress;

            Guid? playerId = _repository.PlayerLogin(userName, domainName, domain, password);
            return new DC.Responses.PlayerIdentifier() { PlayerId = playerId };
        }
 private static void Result_StopTime(IGinTubRepository repository, dynamic data, Guid playerId, ref DC.Responses.PlayData playData)
 {
     bool isTimeStopped = data.isTimeStopped;
     var result = repository.ReadGameStateForPlayer(playerId);
     playData.GameState = TypeAdapter.Adapt<DC.Responses.GameStateData>(result);
     playData.GameState.LastTime = null; // we don't care about this here
 }
 private static void Result_NotImplemented(IGinTubRepository repository, dynamic data, Guid playerId, ref DC.Responses.PlayData playData)
 {
     // shrug!
 }
 private static void Result_RoomStateChange(IGinTubRepository repository, dynamic data, Guid playerId, ref DC.Responses.PlayData playData)
 {
     int roomId = data.roomId;
     int state = data.state;
     var result = repository.PlayerRoomStateChange(playerId, roomId, state);
     playData.Room = TypeAdapter.Adapt<DC.Responses.RoomData>(result.Item1);
     playData.RoomStates = result.Item2.Select(x => TypeAdapter.Adapt<DC.Responses.RoomStateData>(x)).ToList();
     playData.ParagraphStates = result.Item3.Select(x => TypeAdapter.Adapt<DC.Responses.ParagraphStateData>(x)).ToList();
 }
 private static void Result_DeathMessageActivation(IGinTubRepository repository, dynamic data, Guid playerId, ref DC.Responses.PlayData playData)
 {
     int messageId = data.messageId;
     var result = repository.ReadMessage(messageId);
     playData.DeathMessage = TypeAdapter.Adapt<DC.Responses.MessageData>(result);
 }
 private static void Result_EventAcquisition(IGinTubRepository repository, dynamic data, Guid playerId, ref DC.Responses.PlayData playData)
 {
     int eventId = data.eventId;
     repository.PlayerEventAdd(playerId, eventId);
 }
 private static void Result_CharacterAcquisition(IGinTubRepository repository, dynamic data, Guid playerId, ref DC.Responses.PlayData playData)
 {
     int characterId = data.characterId;
     repository.PlayerCharacterAdd(playerId, characterId);
 }
 private static void Result_AreaIdRoomIdTeleport(IGinTubRepository repository, dynamic data, Guid playerId, ref DC.Responses.PlayData playData)
 {
     int areaId = data.areaId;
     int roomId = data.roomId;
     var result = repository.PlayerTeleportAreaIdRoomId(playerId, areaId, roomId);
     playData.Area = TypeAdapter.Adapt<DC.Responses.AreaData>(result.Item1);
     playData.Room = TypeAdapter.Adapt<DC.Responses.RoomData>(result.Item2);
     playData.RoomStates = result.Item3.Select(x => TypeAdapter.Adapt<DC.Responses.RoomStateData>(x)).ToList();
     playData.ParagraphStates = result.Item4.Select(x => TypeAdapter.Adapt<DC.Responses.ParagraphStateData>(x)).ToList();
 }
 private static void Result_ItemAcquisition(IGinTubRepository repository, dynamic data, Guid playerId, ref DC.Responses.PlayData playData)
 {
     int itemId = data.itemId;
     repository.PlayerItemAdd(playerId, itemId);
 }
 private static void Result_RoomXYZMovement(IGinTubRepository repository, dynamic data, Guid playerId, ref DC.Responses.PlayData playData)
 {
     int xDir = data.xDir;
     int yDir = data.yDir;
     int zDir = data.zDir;
     var result = repository.PlayerMoveXYZ(playerId, xDir, yDir, zDir);
     playData.Room = TypeAdapter.Adapt<DC.Responses.RoomData>(result.Item1);
     playData.RoomStates = result.Item2.Select(x => TypeAdapter.Adapt<DC.Responses.RoomStateData>(x)).ToList();
     playData.ParagraphStates = result.Item3.Select(x => TypeAdapter.Adapt<DC.Responses.ParagraphStateData>(x)).ToList();
 }
 private static void Result_RoomXYZTeleport(IGinTubRepository repository, dynamic data, Guid playerId, ref DC.Responses.PlayData playData)
 {
     int xPos = data.xPos;
     int yPos = data.yPos;
     int zPos = data.zPos;
     var result = repository.PlayerTeleportRoomXYZ(playerId, xPos, yPos, zPos);
     playData.Room = TypeAdapter.Adapt<DC.Responses.RoomData>(result.Item1);
     playData.RoomStates = result.Item2.Select(x => TypeAdapter.Adapt<DC.Responses.RoomStateData>(x)).ToList();
     playData.ParagraphStates = result.Item3.Select(x => TypeAdapter.Adapt<DC.Responses.ParagraphStateData>(x)).ToList();
 }
 private void ResultSwitch(int resultTypeId, dynamic data, Guid playerId, ref DC.Responses.PlayData playData)
 {
     _resultHandlers[ResultTypeDictionary.GetResultTypeNameFromId(resultTypeId)]
     (
         _repository,
         data,
         playerId,
         ref playData
     );
 }
        public DC.Responses.PlayData DoCheat(DC.Requests.CheatRequest request)
        {
            CheatDictionary.DoCheat(request.Cheat, request.PlayerId, request.JSONString);

            var result = _repository.ReadGame(request.PlayerId);
            return new DC.Responses.PlayData()
            {
                GameState = TypeAdapter.Adapt<DC.Responses.GameStateData>(result.Item1),
                Area = TypeAdapter.Adapt<DC.Responses.AreaData>(result.Item2),
                Room = TypeAdapter.Adapt<DC.Responses.RoomData>(result.Item3),
                RoomStates = result.Item4.Select(x => TypeAdapter.Adapt<DC.Responses.RoomStateData>(x)).ToList(),
                ParagraphStates = result.Item5.Select(x => TypeAdapter.Adapt<DC.Responses.ParagraphStateData>(x)).ToList()
            };
        }
        public DC.Responses.PlayData DoMessageChoice(DC.Requests.DoMessageChoiceRequest request)
        {
            DC.Responses.PlayData playData = new DC.Responses.PlayData();

            var results = _repository.GetMessageChoiceResults(request.MessageChoiceId);
            if (results.Any())
            {
                results = ResultTypeDictionary.SortResultsByResultTypePriority(results);
                foreach (var result in results)
                {
                    dynamic data = JsonConvert.DeserializeObject(result.JSONData);
                    ResultSwitch(result.ResultType, data, request.PlayerId, ref playData);
                }
            }

            return playData;
        }
        public DC.Responses.PlayData DoAction(DC.Requests.DoActionRequest request)
        {
           DC.Responses.PlayData playData = 
                new DC.Responses.PlayData()
                {
                    Message = new DC.Responses. MessageData()
                    {
                        Id = -1,
                        Text = "Nothing happens."
                    }
                };

           if (request.NounId.HasValue)
           {
               var results = _repository.GetActionResults(request.PlayerId, request.NounId.Value, request.VerbTypeId);
               if (results.Any())
               {
                   UpdateLastTimeAfterAction(request.PlayerId, request.NounId.Value, request.VerbTypeId, request.Time);

                   results = ResultTypeDictionary.SortResultsByResultTypePriority(results);
                   playData.Message = null;
                   foreach (var result in results)
                   {
                       dynamic data = JsonConvert.DeserializeObject(result.JSONData);
                       ResultSwitch(result.ResultType, data, request.PlayerId, ref playData);
                   }
               }
           }

           return playData;
        }
 public DC.Responses.PlayData LoadGame(DC.Requests.LoadGameRequest request)
 {
     var result = _repository.ReadGame(request.PlayerId);
     return new DC.Responses.PlayData()
     {
         GameState = TypeAdapter.Adapt<DC.Responses.GameStateData>(result.Item1),
         Area = TypeAdapter.Adapt<DC.Responses.AreaData>(result.Item2),
         Room = TypeAdapter.Adapt<DC.Responses.RoomData>(result.Item3),
         RoomStates = result.Item4.Select(x => TypeAdapter.Adapt<DC.Responses.RoomStateData>(x)).ToList(),
         ParagraphStates = result.Item5.Select(x => TypeAdapter.Adapt<DC.Responses.ParagraphStateData>(x)).ToList()
     };
 }