예제 #1
0
        internal static async Task NumberUsers()
        {
            Task bidNumberTask = null;

            using (var context = new HypixelContext())
            {
                for (int i = 0; i < 3; i++)
                {
                    var doublePlayersId = await context.Players.GroupBy(p => p.Id).Where(p => p.Count() > 1).Select(p => p.Key).FirstOrDefaultAsync();

                    if (doublePlayersId == 0)
                    {
                        break;
                    }

                    await ResetDoublePlayers(context, doublePlayersId);
                }

                await context.SaveChangesAsync();

                var unindexedPlayers = await context.Players.Where(p => p.Id == 0).Take(2000).ToListAsync();

                if (unindexedPlayers.Any())
                {
                    Console.Write($"  numbering: {unindexedPlayers.Count()} ");
                    foreach (var player in unindexedPlayers)
                    {
                        player.Id = System.Threading.Interlocked.Increment(ref Indexer.highestPlayerId);
                        context.Players.Update(player);
                    }
                    // save all the ids
                    await context.SaveChangesAsync();
                }

                if (unindexedPlayers.Count < 2000)
                {
                    // all players in the db have an id now
                    bidNumberTask = Task.Run(NumberBids);
                    await NumberAuctions(context);

                    await context.SaveChangesAsync();
                }

                // temp migration
                foreach (var item in context.Auctions.Where(a => a.UId == 0)
                         .OrderByDescending(a => a.Id).Take(5000))
                {
                    item.UId = AuctionService.Instance.GetId(item.Uuid);
                    context.Update(item);
                }
                await context.SaveChangesAsync();
            }
            if (bidNumberTask != null)
            {
                await bidNumberTask;
            }

            // give the db a moment to store everything
            await Task.Delay(2000);
        }
예제 #2
0
        private async Task AddOccurences(HypixelContext context)
        {
            foreach (var itemId in ItemDetails.Instance.TagLookup.Values)
            {
                var sample = await context.Auctions
                             .Where(a => a.ItemId == itemId)
                             .OrderByDescending(a => a.Id)
                             .Take(20)
                             .Select(a => a.ItemName)
                             .ToListAsync();

                var names = context.AltItemNames.Where(n => n.DBItemId == itemId);
                foreach (var item in names)
                {
                    var occured = sample.Count(s => s == item.Name);
                    if (occured == 0)
                    {
                        continue;
                    }
                    item.OccuredTimes += occured;
                    context.Update(item);
                }
                await context.SaveChangesAsync();
            }
            await Task.Delay(TimeSpan.FromSeconds(1));
        }
예제 #3
0
 public void SavePurchase(GoogleUser user, int days, string transactionId)
 {
     using (var context = new HypixelContext())
     {
         Server.AddPremiumTime(days, user);
         context.Add(new Bonus()
         {
             BonusTime     = TimeSpan.FromDays(days),
             ReferenceData = transactionId,
             Type          = Bonus.BonusType.PURCHASE,
             UserId        = user.Id
         });
         if (user.ReferedBy != 0)
         {
             context.Add(new Bonus()
             {
                 BonusTime     = TimeSpan.FromDays(days) / 10,
                 ReferenceData = transactionId,
                 Type          = Bonus.BonusType.REFERED_UPGRADE,
                 UserId        = user.ReferedBy
             });
         }
         context.Update(user); context.SaveChanges();
     }
 }
예제 #4
0
        public void WasReferedBy(GoogleUser user, string referer)
        {
            if (user.ReferedBy != 0)
            {
                throw new CoflnetException("already_refered", "You already have used a referal Link. You can only be refered once.");
            }
            var id = hashids.Decode(referer)[0];

            if (id == user.Id)
            {
                throw new CoflnetException("self_refered", "You cant refer yourself");
            }
            using (var context = new HypixelContext())
            {
                user.ReferedBy = id;
                // give the user 'test' premium time
                Server.AddPremiumTime(1, user);
                context.Update(user);
                // persist the boni
                context.Add(new Bonus()
                {
                    BonusTime     = TimeSpan.FromDays(1),
                    ReferenceData = id.ToString(),
                    Type          = Bonus.BonusType.BEING_REFERED,
                    UserId        = user.Id
                });


                var referUser = context.Users.Where(u => u.Id == id).FirstOrDefault();
                if (referUser != null)
                {
                    // award referal bonus to user who refered
                    Server.AddPremiumTime(1, referUser);
                    context.Add(new Bonus()
                    {
                        BonusTime     = TimeSpan.FromDays(1),
                        ReferenceData = user.Id.ToString(),
                        Type          = Bonus.BonusType.REFERAL,
                        UserId        = referUser.Id
                    });
                    context.Update(referUser);
                }
                context.SaveChanges();
            }
        }
예제 #5
0
        private static void ShrinkHitsType(HypixelContext context, IEnumerable <IHitCount> source)
        {
            // heavy searched results are reduced in order to allow other results to overtake them
            var res = source.Where(p => p.HitCount > 4);

            foreach (var item in res)
            {
                item.HitCount = item.HitCount * 9 / 10; // - 1; players that were searched once will be prefered forever
                context.Update(item);
            }
        }
예제 #6
0
        public void SaveHits(HypixelContext context)
        {
            var hits = itemHits;

            itemHits = new ConcurrentDictionary <int, int>();
            foreach (var hit in hits)
            {
                var item = context.Items.Where(item => item.Id == hit.Key).First();
                item.HitCount += hit.Value;
                context.Update(item);
            }
        }
예제 #7
0
 internal void AddToken(int userId, string deviceName, string token)
 {
     using (var context = new HypixelContext())
     {
         var user = context.Users.Where(u => u.Id == userId).Include(u => u.Devices).FirstOrDefault();
         if (user == null)
         {
             throw new CoflnetException("unknown_user", "The user is not known");
         }
         var target = user.Devices.Where(d => d.Name == deviceName);
         if (target.Any())
         {
             var device = target.First();
             device.Token = token;
             context.Update(device);
         }
         else
         {
             var hasPremium = user.PremiumExpires > DateTime.Now;
             if (!hasPremium && user.Devices.Count >= 3)
             {
                 throw new CoflnetException("no_premium", "You need premium to add more than 3 devices");
             }
             if (user.Devices.Count > 10)
             {
                 throw new CoflnetException("limit_reached", "You can't have more than 11 devices linked to your account");
             }
             var device = new Device()
             {
                 UserId = user.Id, Name = deviceName, Token = token
             };
             user.Devices.Add(device);
             context.Update(user);
             context.Add(device);
         }
         context.SaveChanges();
     }
 }
예제 #8
0
        private static async Task ResetDoublePlayers(HypixelContext context, int doublePlayersId)
        {
            if (doublePlayersId % 3 == 0)
            {
                Console.WriteLine($"Found Double player id: {doublePlayersId}, renumbering, highestId: {Indexer.highestPlayerId}");
            }

            foreach (var item in context.Players.Where(p => p.Id == doublePlayersId))
            {
                item.Id = 0;
                context.Update(item);
            }
            foreach (var item in context.Auctions.Where(p => p.SellerId == doublePlayersId))
            {
                item.SellerId = 0;
                context.Update(item);
            }
            foreach (var item in context.Bids.Where(p => p.BidderId == doublePlayersId))
            {
                item.BidderId = 0;
                context.Update(item);
            }
            await context.SaveChangesAsync();
        }
예제 #9
0
        public void SaveHits(HypixelContext context)
        {
            var hits = playerHits;

            playerHits = new ConcurrentDictionary <string, int>();
            foreach (var hit in hits)
            {
                var player = context.Players.Where(player => player.UuId == hit.Key).FirstOrDefault();
                if (player == null)
                {
                    continue;
                }
                player.HitCount += hit.Value;
                context.Update(player);
            }
        }
예제 #10
0
        public override async Task Execute(MessageData data)
        {
            var response = data.GetAs <PlayerSyncCommand.PlayerSyncData>();
            var players  = response.Players;
            var ids      = players.Select(p => p.UuId);

            if (players.Count == 0)
            {
                return; // done
            }
            int count = 0;

            using (var context = new HypixelContext())
            {
                var existingPlayers = context.Players.Where(p => ids.Contains(p.UuId));
                var existing        = existingPlayers.ToDictionary(p => p.UuId);
                foreach (var player in players)
                {
                    if (existing.ContainsKey(player.UuId))
                    {
                        var existingPlayer = existingPlayers.Where(p => p.UuId == player.UuId).FirstOrDefault();
                        if (existingPlayer.Name == null)
                        {
                            existingPlayer.Name = player.Name;
                            context.Update(existingPlayer);
                        }
                        continue;
                    }
                    context.Players.Add(player);
                    count++;
                    if (count % 1000 == 0)
                    {
                        await context.SaveChangesAsync();
                    }
                }
                try
                {
                    await context.SaveChangesAsync();
                }
                catch (Exception e)
                {
                    dev.Logger.Instance.Error(e, "playerSync");
                }
                count = context.Players.Count();
            }
            await data.SendBack(data.Create("playerSync", response.Offset));
        }
        public override async Task Execute(MessageData data)
        {
            var uuid = data.GetAs<string>();
            var amount = (new Random()).Next(20, 999);
            var userId = 1;//data.UserId;
            var player = await PlayerService.Instance.GetPlayer(uuid);
            if (player == default(Player))
                throw new CoflnetException("unkown_player", "This player was not found");

            var sub = new VerifySub(a =>
            {
                var code = a.StartingBid;
                if(a.AuctioneerId != uuid)
                    code = a.Bids.Where(u => u.Bidder == uuid).Select(b => b.Amount).Where(b => b % 1000 == amount).FirstOrDefault();
                Console.WriteLine("vertifying " + code);
                if (code % 1000 == amount)
                    using (var context = new HypixelContext())
                    {
                        var user = context.Users.Where(u => u.Id == userId).FirstOrDefault();
                        user.MinecraftUuid = a.AuctioneerId;
                        context.Update(user);
                        context.SaveChanges();
                    }
            });
            sub.Type = SubscribeItem.SubType.PLAYER;
            sub.UserId = userId;
            sub.TopicId = uuid;
            sub.Price = amount;

            SubscribeEngine.Instance.AddNew(sub);

            var response = new Response()
            {
                StartingBid = amount
            };

            await data.SendBack(data.Create("connectMc", response));
        }
예제 #12
0
        public async Task DoBatch()
        {
            await Task.Delay(TimeSpan.FromMinutes(5));

            var batchSize = 2000;

            using (var context = new HypixelContext())
            {
                var select = context.Auctions
                             .Where(a => a.Id < minId)
                             .OrderByDescending(a => a.Id)
                             .Include(a => a.NBTLookup)
                             .Include(a => a.NbtData)
                             .Take(batchSize);
                foreach (var auction in select)
                {
                    if (auction.NBTLookup != null && auction.NBTLookup.Count > 0)
                    {
                        continue;
                    }
                    try
                    {
                        auction.NBTLookup = NBT.CreateLookup(auction.NbtData);
                        context.Update(auction);
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine($"could not generate nbtlookup for {auction.Uuid} {e.Message} \n{e.StackTrace} \n {e.InnerException?.Message} {e.InnerException.StackTrace}");
                    }
                }
                int updated = await context.SaveChangesAsync();

                Console.WriteLine($"updated nbt lookup for {updated} auctions, highest: {minId}");
                minId -= batchSize;
            }
        }
예제 #13
0
        public override Task Execute(MessageData data)
        {
            string productId;

            try
            {
                productId = data.GetAs <string>();
            }
            catch (Exception)
            {
                throw new CoflnetException("invaild_data", "Data should contain a product id as string");
            }
            var product = GetProduct(productId);
            var price   = GetPrice(productId);

            var domain  = "https://sky.coflnet.com";
            var options = new SessionCreateOptions
            {
                PaymentMethodTypes = new List <string>
                {
                    "card",
                },
                LineItems = new List <SessionLineItemOptions>
                {
                    new SessionLineItemOptions
                    {
                        PriceData = new SessionLineItemPriceDataOptions
                        {
                            UnitAmount = price.UnitAmount,

                            Currency = "eur",
                            Product  = productId
                        },

                        // Description = "Unlocks premium features: Subscribe to 100 Thrings, Search with multiple filters and you support the project :)",
                        Quantity = 1,
                    },
                },
                Metadata          = product.Metadata,
                Mode              = "payment",
                SuccessUrl        = domain + "/success",
                CancelUrl         = domain + "/cancel",
                ClientReferenceId = data.UserId.ToString()
            };
            var     service = new SessionService();
            Session session;

            try
            {
                session = service.Create(options);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                throw new CoflnetException("internal_error", "service not working");
            }
            using (var context = new HypixelContext())
            {
                var user = data.User;
                context.Update(user);
                context.SaveChanges();
            }

            return(data.SendBack(data.Create("checkoutSession", session.Id), false));
            //return Json(new { id = session.Id });
        }