public async Task <IActionResult> PostHeros([FromBody] PassedData <string> passedData) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } DateTime now = DateTime.UtcNow; if (passedData.UserToken == null) { return(BadRequest(new DataError("securityErr", "No authorization controll."))); } UserToken dbtoken = Security.CheckUserToken(this._context, passedData.UserToken); if (dbtoken == null) { return(BadRequest(new DataError("securityErr", "Your data has probably been stolen or modified manually. We suggest password's change."))); } else { if (!dbtoken.IsTimeValid(now)) { return(BadRequest(new DataError("timeoutErr", "You have been too long inactive. Relogin is required."))); } else { dbtoken.UpdateToken(now); } } Heros hero = _context.Heros.Where(e => e.Name == passedData.Data).Join(_context.UsersHeros.Where(e => e.UserName == dbtoken.UserName), e => e.HeroId, e => e.HeroId, (a, b) => a).FirstOrDefault(); if (hero == null) { return(BadRequest(new DataError("noHeroErr", "Hero is not available."))); } ActionToken actionToken = Security.GenerateActionToken(hero.HeroId, _context); ActionTokenResult tokenResult = new ActionTokenResult() { HeroName = hero.Name, Token = actionToken.HashedToken, }; try { await _context.SaveChangesAsync(); } catch (DbUpdateException) { return(BadRequest(new DataError("databaseErr", "Failed to update tokens."))); } try { var heroStatus = LocationHandler.GetHeroGeneralStatus(_context, hero, now); // equipment generation var Equipment = _context.Equipment.FirstOrDefault(e => e.HeroId == hero.HeroId); if (Equipment == null) { return(BadRequest(new DataError("equipmentErr", "Hero is without equipment."))); } List <int?> used = new List <int?> { Equipment.Armour, Equipment.Bracelet, Equipment.FirstHand, Equipment.Gloves, Equipment.Helmet, Equipment.Neckles, Equipment.Ring1, Equipment.Ring2, Equipment.SecondHand, Equipment.Shoes, Equipment.Trousers }; var ItemsOn = used.Where(e => e.HasValue).Select(e => e.Value).ToList(); var Backpack = _context.Backpack.Where(e => e.HeroId == hero.HeroId); var UsedItems = Backpack.Select(e => e.ItemId).Distinct().ToList(); UsedItems.AddRange(ItemsOn); UsedItems = UsedItems.Distinct().OrderBy(e => e).ToList(); var ItemsInUse = _context.Items.Join(UsedItems, e => e.ItemId, e => e, (a, b) => a).ToArray(); EquipmentResult EQ = Equipment.GenResult(ItemsInUse.ToArray(), Backpack.ToList()); return(Ok(new { success = true, actiontoken = tokenResult, hero = hero.GenResult(EQ, heroStatus.Location, heroStatus.StatusData) })); } catch (Exception e) { return(BadRequest(new DataError("statusErr", e.Message))); } }
public async Task <IActionResult> PostLocationAction([FromBody] PassedGameData <int> passedData) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } DateTime now = DateTime.UtcNow; if (passedData.UserToken == null || passedData.ActionToken == null) { return(BadRequest(new DataError("securityErr", "No authorization controll."))); } UserToken dbtoken = Security.CheckUserToken(this._context, passedData.UserToken); if (dbtoken == null) { return(BadRequest(new DataError("securityErr", "Your data has probably been stolen or modified manually. We suggest password's change."))); } else { if (!dbtoken.IsTimeValid(now)) { return(BadRequest(new DataError("timeoutErr", "You have been too long inactive. Relogin is required."))); } else { dbtoken.UpdateToken(now); } } Heros hero = _context.Heros.FirstOrDefault(e => e.Name == passedData.ActionToken.HeroName); ActionToken gametoken = Security.CheckActionToken(_context, passedData.ActionToken, hero.HeroId); if (gametoken == null) { return(BadRequest(new DataError("securityErr", "Your data has probably been stolen or modified manually. We suggest password's change."))); } else { if (!gametoken.IsTimeValid(now)) { return(BadRequest(new DataError("timeoutErr", "You have been too long inactive. Relogin is required."))); } else { gametoken.UpdateToken(now); } } // now do your stuff... if (hero.Status == 0) { var location = _context.HerosLocations.FirstOrDefault(e => (e.HeroId == hero.HeroId) && (e.LocationIdentifier == hero.CurrentLocation)); if (location == null) { return(BadRequest(new DataError("LocationErr", "Location is not available."))); } var descr = _context.LocationsDb.FirstOrDefault(e => e.LocationIdentifier == location.LocationIdentifier); if (descr == null) { return(BadRequest(new DataError("LocationErr", "LocationData is not available."))); } try { // TODO check location type int LocationType = descr.LocationGlobalType; if (LocationType != 2) { LocationDescription description = JsonConvert.DeserializeObject <LocationDescription>(descr.Sketch); LocationState state = JsonConvert.DeserializeObject <LocationState>(location.Description); description.LocationGlobalType = descr.LocationGlobalType; var CurrentNode = description.MainNodes.FirstOrDefault(e => e.NodeID == state.CurrentLocation); if (CurrentNode.Data == -1) { try { await _context.SaveChangesAsync(); } catch (DbUpdateException) { return(BadRequest(new DataError("databaseErr", "Failed to remember travel."))); } return(BadRequest(new DataError("notImplementedErr", "This feature has not been implemented yet. We are working on it!"))); } try { if (!LocationHandler.OptionsForLocation.ContainsKey(CurrentNode.LocationType)) { throw new Exception(); } if (!LocationHandler.LocationTypeFunctions.ContainsKey(LocationHandler.OptionsForLocation[CurrentNode.LocationType][passedData.Data])) { throw new Exception(); } var func = LocationHandler.LocationTypeFunctions[LocationHandler.OptionsForLocation[CurrentNode.LocationType][passedData.Data]]; func(_context, hero, CurrentNode.Data); try { await _context.SaveChangesAsync(); } catch (DbUpdateException) { return(BadRequest(new DataError("databaseErr", "Failed to remember action."))); } } catch (OperationException e) { return(BadRequest(new DataError(e.ErrorClass, e.Message))); } catch { return(BadRequest(new DataError("notImplementedErr", "This feature has not been implemented yet. We are working on it!"))); } } else { InstanceDescription description = JsonConvert.DeserializeObject <InstanceDescription>(descr.Sketch); InstanceState state = JsonConvert.DeserializeObject <InstanceState>(location.Description); description.LocationGlobalType = descr.LocationGlobalType; var CurrentNode = description.MainNodes.FirstOrDefault(e => e.NodeID == state.CurrentLocation); if (CurrentNode.Data == -1) { try { await _context.SaveChangesAsync(); } catch (DbUpdateException) { return(BadRequest(new DataError("databaseErr", "Failed to remember travel."))); } return(BadRequest(new DataError("notImplementedErr", "This feature has not been implemented yet. We are working on it!"))); } try { if (!LocationHandler.OptionsForInstances.ContainsKey(CurrentNode.InstanceType)) { throw new Exception(); } if (!LocationHandler.InstanceTypeFunctions.ContainsKey(LocationHandler.OptionsForInstances[CurrentNode.InstanceType][passedData.Data])) { throw new Exception(); } var func = LocationHandler.InstanceTypeFunctions[LocationHandler.OptionsForInstances[CurrentNode.InstanceType][passedData.Data]]; func(_context, hero, CurrentNode.Data); try { await _context.SaveChangesAsync(); } catch (DbUpdateException) { return(BadRequest(new DataError("databaseErr", "Failed to remember action."))); } } catch { return(BadRequest(new DataError("notImplementedErr", "This feature has not been implemented yet. We are working on it!"))); } } // load new hero status try { var heroStatus = LocationHandler.GetHeroGeneralStatus(_context, hero, now); return(Ok(new { success = true, location = heroStatus.Location, statusData = heroStatus.StatusData, heroStatus = heroStatus.HeroStatus })); } catch (Exception e) { return(BadRequest(new DataError("statusErr", e.Message))); } } catch { return(BadRequest(new DataError("LocationErr", "Location is not available."))); } } else { return(BadRequest(new DataError("LocationErr", "Hero is not able to change state."))); } }