public Trade AddAsk(string country, Ask ask, out bool updated) { using (var database = new RWCDatabaseContext()) { var dbCountry = database.Countries .Include(i => i.Bids) .Include(i => i.Ask) .Include("User.Countries") .First(i => i.Code == country); var dbBids = dbCountry.Bids.ToList(); var dbAsk = dbCountry.Ask; updated = false; if (dbAsk != null && dbCountry.User.UserID==ask.UserID) { dbAsk.TimeStamp = ask.TimeStamp; dbAsk.Price = ask.Price; updated = true; database.SaveChanges(); if (!dbBids.Any()) { return null; } } ask.CountryID = dbCountry.CountryID; if (!dbBids.Any() && dbAsk==null) { dbCountry.Ask = ask; database.SaveChanges(); return null; } var highestBid = dbBids.OrderByDescending(i => i.Price) .ThenBy(i => i.TimeStamp) .First(); if (highestBid.Price >= ask.Price) { database.Bids.Remove(highestBid); dbCountry.User.Countries.Remove(dbCountry); dbCountry.User = highestBid.User; dbCountry.Ask = null; var trade = new Trade() { BuyerID = highestBid.UserID, SellerID = ask.UserID, CountryID = dbCountry.CountryID, Price = ask.Price, TimeStamp = DateTime.UtcNow }; database.Trades.Add(trade); database.SaveChanges(); return trade; } if (updated)return null; dbCountry.Ask = ask; database.SaveChanges(); return null; } }
private Task RunOwner(string country, string owner, WebHookHandlerContext context) { if (!Exchange.Instance.IsValidCountry(country)) { return ReturnMessage("Invalid country code. Try again!", context); } if (Exchange.Instance.CountryDropped(country)) { return ReturnMessage("This country is already out of the cup. Come on, keep up!", context); } int? userId; using (var database = new RWCDatabaseContext()) { userId = database.Users.FirstOrDefault(i => i.UserName == owner)?.UserID; } if (userId == null) return ReturnMessage("Invalid username!", context); if (Exchange.Instance.SetOwner(country, userId.Value)) { ReturnMessage($"Congrats @{owner} You now own {country}.", context); } return Task.FromResult(true); }
public Trade AddBid(string country,Bid bid, out bool updated) { using (var database = new RWCDatabaseContext()) { var dbCountry = database.Countries .Include(i=>i.Bids) .Include(i=>i.Ask) .Include("User.Countries") .First(i => i.Code == country); var dbBids = dbCountry.Bids.ToList(); var dbAsk = dbCountry.Ask; var existingForUser = dbBids.FirstOrDefault(i => i.User.UserID == bid.UserID); updated = false; bid.CountryID = dbCountry.CountryID; if (existingForUser != null) { existingForUser.TimeStamp = bid.TimeStamp; existingForUser.Price = bid.Price; updated = true; database.SaveChanges(); if (dbAsk == null || !dbBids.OrderByDescending(i => i.Price) .ThenBy(i => i.TimeStamp) .First() .Equals(bid)) { return null; } } if (dbAsk == null) { dbCountry.Bids.Add(bid); database.SaveChanges(); return null; } if (bid.Price >= dbAsk.Price) { var currentSeller = dbCountry.User.UserID; dbCountry.Ask = null; dbCountry.User.Countries.Remove(dbCountry); dbCountry.UserID = bid.UserID; if (updated) { database.Bids.Remove(existingForUser); } var trade = new Trade { BuyerID = bid.UserID, CountryID = dbCountry.CountryID, Price = bid.Price, SellerID =currentSeller, TimeStamp = DateTime.UtcNow }; database.Trades.Add(trade); database.SaveChanges(); return trade; } if (updated) return null; dbCountry.Bids.Add(bid); database.SaveChanges(); return null; } }
public bool SetOwner(string country, int userId) { using (var database = new RWCDatabaseContext()) { var user = database.Users.Find(userId); var dbCountry = database.Countries.FirstOrDefault(i => i.Code == country); if (dbCountry == null || dbCountry.IsDropped) return false; if (user.UserName == "house") { dbCountry.Bids.Clear(); dbCountry.Ask = new Ask { Price = 0.01, TimeStamp = DateTime.Now, UserID = user.UserID,CountryID = dbCountry.CountryID}; } user.Countries.Add(dbCountry); dbCountry.User = user; dbCountry.Ask = null; database.SaveChanges(); return true; } }
public bool PullAsk(string country, int userId) { using (var database = new RWCDatabaseContext()) { var dbCountry = database.Countries .FirstOrDefault(i => i.Code == country); if (dbCountry == null || dbCountry.IsDropped) return false; if(dbCountry.Ask==null || dbCountry.User.UserID!=userId) return false; dbCountry.Ask = null; database.SaveChanges(); return true; } }
public bool PullBid(string country, int userId) { using (var database = new RWCDatabaseContext()) { var dbCountry = database.Countries .Include(i=>i.Bids) .FirstOrDefault(i => i.Code == country); if (dbCountry == null || dbCountry.IsDropped) return false; var bid = dbCountry.Bids.FirstOrDefault(i => i.UserID == userId); if (bid == null) return false; database.Bids.Remove(bid); database.SaveChanges(); return true; } }
public bool IsCurrentOwner(string country, int userId) { using (var database = new RWCDatabaseContext()) { return database.Countries.Include(i=>i.User).FirstOrDefault(i => i.Code == country) ?.User?.UserID == userId; } }
public bool CurrentlyOwned(string country) { using (var database = new RWCDatabaseContext()) { var dbCountry = database.Countries.FirstOrDefault(i => i.Code == country); return dbCountry != null && !dbCountry.IsDropped && dbCountry.User != null; } }
public List<Bid> GetBids(string country) { using (var database = new RWCDatabaseContext()) { var dbCountry = database.Countries .Include("Bids.User") .FirstOrDefault(i => i.Code == country); return dbCountry?.Bids.OrderByDescending(i=>i.Price).ThenBy(i=>i.TimeStamp).ToList() ?? new List<Bid>(); } }
public List<KeyValuePair<string, string>> GetOwners() { using (var database = new RWCDatabaseContext()) { var owners = (from country in database.Countries select new { country.Code, country.User.UserName}) .ToList(); return new List<KeyValuePair<string, string>>(owners.Select(i=>new KeyValuePair<string, string>(i.Code,i.UserName))); } }
public Bid GetBestBid(string country) { using (var database = new RWCDatabaseContext()) { var dbCountry = database.Countries.Include("Bids.User").FirstOrDefault(i => i.Code == country); return dbCountry==null||!dbCountry.Bids.Any()?null: dbCountry.Bids.OrderByDescending(i=>i.Price).ThenBy(i=>i.TimeStamp).First(); } }
public Ask GetBestAsk(string country) { using (var database = new RWCDatabaseContext()) { var dbCountry = database.Countries.Include("Ask.User").FirstOrDefault(i => i.Code == country); return dbCountry?.Ask; } }
public string DropTeam(string country) { using (var database = new RWCDatabaseContext()) { var dbCountry = database.Countries .Include(i=>i.Bids) .FirstOrDefault(i => i.Code == country); if (dbCountry == null || dbCountry.IsDropped) return null; dbCountry.Ask = null; database.Bids.RemoveRange(dbCountry.Bids); var currentOwner = dbCountry.User?.UserName; dbCountry.User = null; dbCountry.IsDropped = true; database.SaveChanges(); return currentOwner; } }
private Task RunPull(bool isBid, string country, string user, WebHookHandlerContext context) { if (!Exchange.Instance.IsValidCountry(country)) { return ReturnMessage("Invalid country code. Try again!", context); } if (Exchange.Instance.CountryDropped(country)) { return ReturnMessage("This country is already out of the cup. Come on, keep up!", context); } int userId; using (var database = new RWCDatabaseContext()) { var dbUser = database.Users.FirstOrDefault(i => i.UserName == user); if (dbUser == null) return ReturnMessage($"Sorry {user} but you don't appear to be a valid user on the exchange. Speak to the boss!",context); userId = dbUser.UserID; } if (!isBid && !Exchange.Instance.IsCurrentOwner(country, userId)) { return ReturnMessage($"You aren't the current owner of {country}, so you have no offers in the market.",context); } if (isBid) { if (Exchange.Instance.PullBid(country, userId)) return ReturnMessage($"Thanks @{user} You're bid for {country} has been dropped from the market.", context); ReturnMessage($"{user} - Pull failed. Do you even have a bid in the market?", context); } if(Exchange.Instance.PullAsk(country,userId))return ReturnMessage($"Thanks @{user} You're offer to sell {country} has been dropped from the market.",context); return ReturnMessage($"@{user} - Pull failed. Do you even have a sell offer in the market?", context); }
public bool IsValidCountry(string country) { using (var database = new RWCDatabaseContext()) { var countryFound = database.Countries.FirstOrDefault(i => i.Code == country); return countryFound != null; } }
private Task RunTrade(bool isBuy, string country, string user, double price, WebHookHandlerContext context) { if (!Exchange.Instance.IsValidCountry(country)) { return ReturnMessage("Invalid country code. Try again!", context); } if (Exchange.Instance.CountryDropped(country)) { return ReturnMessage($"This country is already out of the cup. Come on, keep up! Go {(isBuy?"buy":"sell")} another one.",context); } int userId; using (var database = new RWCDatabaseContext()) { var dbUser = database.Users.FirstOrDefault(i => i.UserName == user); if(dbUser==null)return ReturnMessage("Sorry but you're not a valid user, speak to the boss!",context); userId = dbUser.UserID; } var isCurrentOwner = Exchange.Instance.IsCurrentOwner(country, userId); if (isBuy && isCurrentOwner) return ReturnMessage($"@{user} you already own {country}! You can't buy it again you fool!", context); if (!isBuy && !isCurrentOwner) return ReturnMessage($"@{user} you dont own {country}. You can't sell something you don't own you fool!", context); if (isBuy) { if(!Exchange.Instance.CurrentlyOwned(country))return ReturnMessage($"{country} doesn't yet have an owner, wait until it does before you start to place bids.",context); bool updated; var trade = Exchange.Instance.AddBid(country,new Bid { Price = price, TimeStamp = DateTime.UtcNow, UserID = userId},out updated); if (trade!=null) { //find seller by name string sellerName; using (var db = new RWCDatabaseContext()) { sellerName = db.Users.Find(trade.SellerID).UserName; } return ReturnMessage($"WOOOO! You traded! @{user} you now own {country}, and you owe @{sellerName} *£{trade.Price}*. Pay up or I'll send the bailiffs!", context); } if (updated) { return ReturnMessage($"@{user} you're buy request has been updated for {country}. Let's hope we can get a matching sale price.",context); } return ReturnMessage("You're bid has been accepted, but it's not triggered a trade yet. Fingers crossed for you!", context); } else { bool updated; var trade = Exchange.Instance.AddAsk(country, new Ask{ Price = price, TimeStamp = DateTime.UtcNow,UserID = userId},out updated); if (trade!=null) { //find buyer by name string buyerName; using (var db = new RWCDatabaseContext()) { buyerName = db.Users.Find(trade.BuyerID).UserName; } return ReturnMessage($"WOOOO! You traded! @{buyerName} you now own {country}, and you owe @{user} *£{trade.Price}*. Pay up or I'll send the bailiffs!", context); } if (updated) { return ReturnMessage($"@{user} you're sell request has been update for {country}. Let's wait for a buyer!",context); } return ReturnMessage("You're sell offer has been accepted but it's not triggered a trade yet. Fingers crossed for you!", context); } }
public bool CountryDropped(string country) { using (var database = new RWCDatabaseContext()) { var countryFound = database.Countries.FirstOrDefault(i => i.Code == country); return countryFound==null || countryFound.IsDropped; } }