Exemplo n.º 1
0
        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;
            }
        }
Exemplo n.º 2
0
 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);
 }
Exemplo n.º 3
0
 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;
     }
 }
Exemplo n.º 4
0
 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;
     }
 }
Exemplo n.º 5
0
 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;
     }
 }
Exemplo n.º 6
0
 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;
     }
 }
Exemplo n.º 7
0
 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;
     }
 }
Exemplo n.º 8
0
 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;
     }
 }
Exemplo n.º 9
0
 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>();
     }
 }
Exemplo n.º 10
0
        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)));
            }
        }
Exemplo n.º 11
0
 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();
     }
 }
Exemplo n.º 12
0
 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;
     }
 }
Exemplo n.º 13
0
 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;
     }
 }
Exemplo n.º 14
0
        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);
        }
Exemplo n.º 15
0
 public bool IsValidCountry(string country)
 {
     using (var database = new RWCDatabaseContext())
     {
         var countryFound = database.Countries.FirstOrDefault(i => i.Code == country);
         return countryFound != null;
     }
 }
Exemplo n.º 16
0
 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);
     }
 }
Exemplo n.º 17
0
 public bool CountryDropped(string country)
 {
     using (var database = new RWCDatabaseContext())
     {
         var countryFound = database.Countries.FirstOrDefault(i => i.Code == country);
         return countryFound==null || countryFound.IsDropped;
     }
 }