Files
NetrunnerChallenge/src/NetrunnerChallenge/Controllers/HomeController.cs
Tommy Parnell 2ca24ba812 init
2015-05-23 15:04:20 -04:00

114 lines
4.3 KiB
C#

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using NetrunnerChallenge.Data;
using NetrunnerChallenge.Extensions;
using NetrunnerChallenge.Models;
using NetrunnerDb.Net.Responses;
using Newtonsoft.Json;
namespace NetrunnerChallenge.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
using (var db = new DatabaseContext())
{
var mods = db.FactionsDb
.ToList()
.Where(a => !string.Equals(a.FactionName, "Neutral", StringComparison.CurrentCultureIgnoreCase))
.Select(a => a.FactionName)
.ToList();
mods.Insert(0, "Random");
return View(mods);
}
}
/// <exception cref="NotImplementedException">Always.</exception>
public ActionResult Challenge(string id)
{
using (var db = new DatabaseContext())
{
var challege = db.ChallengeDb
.Include(a=>a.Faction)
.Include(a=>a.Cards)
.FirstOrDefault(a => a.Id == id);
if (challege == null)
{
Response.StatusCode = 404;
ViewBag.ErrorCode = 404;
return View("Error");
}
var cards = new ConcurrentBag<OneCard>();
challege.Cards.AsParallel().ForAll(a =>
{
cards.Add(new NetrunnerApi().GetCard(a.Code).First());
});
var viewModel = new ChallengeResultViewModel {Cards = cards, Challenge = challege};
if (this.HttpContext.Request.IsAjaxRequest())
{
return PartialView("Challenge",viewModel);
}
else
{
return View("Challenge", viewModel);
}
}
}
[HttpPost]
public ActionResult Generate(string faction, int cardAmount = 5)
{
using (var db = new DatabaseContext())
{
var dbFaction = db.FactionsDb.ToList();
var factionMatch = string.Equals(faction, "random", StringComparison.InvariantCultureIgnoreCase)
? dbFaction
.Where(a => !string.Equals(a.FactionName, "Neutral", StringComparison.CurrentCultureIgnoreCase))
.RandomElement()
: dbFaction
.FirstOrDefault(a => string.Equals(a.FactionName, faction, StringComparison.CurrentCultureIgnoreCase));
if (factionMatch == null)
{
throw new Exception(string.Format("{0} is invalid", faction));
}
var generator = new Generator();
string rnmId = null;
while (rnmId == null || db.ChallengeDb.ToList().Any(a => string.Equals(a.Id, rnmId)))
{
rnmId = generator.GenerateRandomString();
}
var challenge = new Challenge
{
Id = rnmId,
CreationDate = DateTime.UtcNow,
Faction = factionMatch,
Cards = new List<ChallengeCard>()
};
var cards = new NetrunnerApi().GetCards()
.Where(a => string.Equals(a.Side, factionMatch.Side, StringComparison.CurrentCultureIgnoreCase) && a.Agendapoints == null && !string.IsNullOrWhiteSpace(a.Imagesrc))
.ToList();
var length = cards.Count - 1;
var randgen = new Random();
for (int i = 0; i < cardAmount; i++)
{
var index = randgen.Next(length);
var chal = new ChallengeCard {Code = cards[index].Code};
db.Entry(chal).State = EntityState.Added;
challenge.Cards.Add(chal);
}
db.ChallengeDb.Add(challenge);
db.SaveChanges();
return Challenge(challenge.Id);
}
}
}
}