示例#1
0
        public async Task UpdateClubMember_ToNotExistingClubMembership_DatabaseUpdates()
        {
            var clubSubscription = new ClubSubscription()
            {
                ClubId             = Guid.NewGuid(),
                ClubSubscriptionId = Guid.NewGuid()
            };
            var clubMember = new ClubMember()
            {
                ClubId             = clubSubscription.ClubId,
                UserId             = Guid.NewGuid(),
                ClubSubscriptionId = clubSubscription.ClubSubscriptionId
            };

            using (var context = _factory.CreateContext())
            {
                await context.ClubSubscriptions.AddRangeAsync(clubSubscription);

                await context.ClubMembers.AddAsync(clubMember);

                await context.SaveChangesAsync();
            }

            var request = new UpdateClubMemberRequest()
            {
                ClubId             = clubSubscription.ClubId,
                ClubSubscriptionId = Guid.NewGuid(),
                UserId             = clubMember.UserId
            };

            Assert.ThrowsAsync <DbUpdateException>(async() =>
                                                   await _mutations.UpdateClubMemberAsync(request));

            await _publish.Received(0).Publish(Arg.Any <ClubMemberUpdatedEvent>());
        }
示例#2
0
        public async Task CreateClubMember_ValidRequest_AddedToDatabase()
        {
            var clubSubscription = new ClubSubscription()
            {
                ClubId             = Guid.NewGuid(),
                ClubSubscriptionId = Guid.NewGuid()
            };

            using (var context = _factory.CreateContext())
            {
                await context.ClubSubscriptions.AddAsync(clubSubscription);

                await context.SaveChangesAsync();
            }


            var request = new CreateClubMemberRequest()
            {
                ClubSubscriptionId = clubSubscription.ClubSubscriptionId,
                UserId             = Guid.NewGuid()
            };

            await _mutations.CreateClubMemberAsync(request);

            using (var context = _factory.CreateContext())
            {
                var clubMember = context.ClubMembers.FirstOrDefault(clubMember => clubMember.UserId == request.UserId);
                Assert.That(clubMember, Is.Not.Null);
                Assert.That(context.ClubMembers.Count(), Is.EqualTo(1));
            }

            await _publish.Received(1).Publish(Arg.Any <ClubMemberCreatedEvent>());
        }
示例#3
0
        public static ServerMessage Compose(ClubSubscription SubscriptionManager, bool BoughtFromCatalog = false)
        {
            TimeSpan TimeSpan      = SubscriptionManager.ExpireDateTime - DateTime.Now;
            int      DisplayMonths = 0;
            int      DisplayDays   = 0;

            if (TimeSpan.TotalSeconds > 0)
            {
                DisplayMonths = (int)Math.Floor((double)(TimeSpan.Days / 31.0));
                DisplayDays   = TimeSpan.Days - (31 * DisplayMonths);
            }

            // @Gclub_habboSGRBHJIH[MAHHHH

            ServerMessage Message = new ServerMessage(OpcodesOut.SUBSCRIPTION_STATUS);

            Message.AppendStringWithBreak("habbo_club");
            Message.AppendInt32(DisplayDays);                                                                                              // days left in the current month
            Message.AppendBoolean(SubscriptionManager.IsActive);                                                                           // 1 if not expired
            Message.AppendInt32(DisplayMonths);                                                                                            // months left after the current month
            Message.AppendInt32(BoughtFromCatalog ? 2 : 1);                                                                                // was true even w/o subscription
            Message.AppendInt32(1);                                                                                                        // Unknown (Gift points?)
            Message.AppendBoolean(SubscriptionManager.IsActive && SubscriptionManager.SubscriptionLevel == ClubSubscriptionLevel.VipClub); // Is VIP (boolean)
            Message.AppendInt32((int)(SubscriptionManager.PastHcTime / 86400));                                                            // Past HC Days
            Message.AppendInt32((int)(SubscriptionManager.PastVipTime / 86400));                                                           // Past VIP Days
            Message.AppendInt32(0);                                                                                                        // Discount message enable (boolean)
            Message.AppendInt32(30);                                                                                                       // Discount message => "Regular price"
            Message.AppendInt32(25);                                                                                                       // Discount message => "Your price"
            return(Message);
        }
示例#4
0
        public async Task CreateClubMember_DuplicateMemberships_Fails()
        {
            var clubSubscription = new ClubSubscription()
            {
                ClubId             = Guid.NewGuid(),
                ClubSubscriptionId = Guid.NewGuid()
            };

            using (var context = _factory.CreateContext())
            {
                await context.ClubSubscriptions.AddAsync(clubSubscription);

                await context.SaveChangesAsync();
            }


            var request = new CreateClubMemberRequest()
            {
                ClubSubscriptionId = clubSubscription.ClubSubscriptionId,
                UserId             = Guid.NewGuid()
            };
            await _mutations.CreateClubMemberAsync(request);

            Assert.ThrowsAsync <InvalidOperationException>(async() =>
                                                           await _mutations.CreateClubMemberAsync(request));

            await _publish.Received(1).Publish(Arg.Any <ClubMemberCreatedEvent>());
        }
示例#5
0
        private static void GetClubOffers(Session Session, ClientMessage Message)
        {
            ServerMessage Response = TryGetResponseFromCache(Session.CharacterId, Message);

            if (Response != null)
            {
                Session.SendData(Response);
                return;
            }

            ClubSubscription        Subscription    = Session.SubscriptionManager;
            List <CatalogClubOffer> CorrectedOffers = new List <CatalogClubOffer>();

            foreach (CatalogClubOffer Offer in mClubOffers.Values)
            {
                if ((Offer.IsUpgrade && Subscription.SubscriptionLevel != ClubSubscriptionLevel.BasicClub) ||
                    (Offer.Level == ClubSubscriptionLevel.BasicClub && Subscription.SubscriptionLevel ==
                     ClubSubscriptionLevel.VipClub) || (Offer.Level == ClubSubscriptionLevel.VipClub &&
                                                        !Offer.IsUpgrade && Subscription.SubscriptionLevel == ClubSubscriptionLevel.BasicClub))
                {
                    continue;
                }

                CorrectedOffers.Add(Offer);
            }

            Response = CatalogClubOffersComposer.Compose(CorrectedOffers,
                                                         Session.SubscriptionManager.IsActive ?
                                                         Session.SubscriptionManager.TimestampExpire : UnixTimestamp.GetCurrent());
            AddToCacheIfNeeded(Session.CharacterId, Message, Response);
            Session.SendData(Response);
        }
示例#6
0
        public async Task Consume_SubscriptionExistAndNoMember_Created()
        {
            var sub = new ClubSubscription()
            {
                ClubId             = Guid.NewGuid(),
                ClubSubscriptionId = Guid.NewGuid()
            };

            using (var context = _factory.CreateContext())
            {
                context.ClubSubscriptions.Add(sub);
                context.SaveChanges();
            }

            var @event = new SignUpSubscriptionSuccessEvent()
            {
                ClubSubscriptionId = sub.ClubSubscriptionId,
                UserId             = Guid.NewGuid()
            };

            await SendEvent(@event);

            using (var context = _factory.CreateContext())
            {
                Assert.That(context.ClubMembers.Count(), Is.EqualTo(1));
                var memberDb = context.ClubMembers.Find(@event.UserId, sub.ClubId);
                Assert.That(memberDb, Is.Not.Null);
                Assert.That(memberDb.ClubSubscriptionId, Is.EqualTo(sub.ClubSubscriptionId));
            }
            await _publishEndpoint.Received(1).Publish(Arg.Any <ClubMemberCreatedEvent>());

            await _publishEndpoint.Received(0).Publish(Arg.Any <ClubMemberUpdatedEvent>());
        }
示例#7
0
        protected void SetupAnEntireClub()
        {
            _club = new Club()
            {
                ClubId = Guid.NewGuid()
            };
            _room = new Room()
            {
                ClubId = _club.ClubId,
                RoomId = Guid.NewGuid()
            };
            _clubSubscription = new ClubSubscription()
            {
                ClubId             = _club.ClubId,
                ClubSubscriptionId = Guid.NewGuid()
            };
            _instructor = new Instructor()
            {
                ClubId       = _club.ClubId,
                InstructorId = Guid.NewGuid()
            };

            using (var context = _factory.CreateContext())
            {
                context.Clubs.Add(_club);
                context.Rooms.Add(_room);
                context.Instructors.Add(_instructor);
                context.Subscriptions.Add(_clubSubscription);
                context.SaveChanges();
            }
        }
示例#8
0
        public string SignUserUpToSubscription(string paymentMethodId, User user, ClubSubscription clubSubscription)
        {
            var options = new PaymentMethodAttachOptions
            {
                Customer = user.StripeUserId,
            };
            var service       = new PaymentMethodService();
            var paymentMethod = service.Attach(paymentMethodId, options);

            // Update customer's default invoice payment method
            var customerOptions = new CustomerUpdateOptions
            {
                InvoiceSettings = new CustomerInvoiceSettingsOptions
                {
                    DefaultPaymentMethod = paymentMethod.Id,
                },
            };
            var customerService = new CustomerService();

            customerService.Update(user.StripeUserId, customerOptions);

            // Create subscription
            var subscriptionOptions = new SubscriptionCreateOptions
            {
                Customer = user.StripeUserId,
                Items    = new List <SubscriptionItemOptions>()
                {
                    new SubscriptionItemOptions
                    {
                        Price = clubSubscription.StripePriceId,
                    },
                },
                Metadata = new Dictionary <string, string>()
                {
                    { "UserId", user.UserId.ToString() },
                    { "ClubSubscriptionId", clubSubscription.ClubSubscriptionId.ToString() },
                }
            };

            subscriptionOptions.AddExpand("latest_invoice.payment_intent");
            var subscriptionService = new SubscriptionService();

            try
            {
                Subscription subscription = subscriptionService.Create(subscriptionOptions);
                return("Went good");
            }
            catch (StripeException e)
            {
                Console.WriteLine($"Failed to create subscription.{e}");
                return("Went bad");
                // return BadRequest();
            }
        }
示例#9
0
        public async Task UpdateSubscription_SubscriptionDoesExist_SubscriptionAreUpdated()
        {
            //Arrange
            var club = new Club()
            {
                ClubId = Guid.NewGuid()
            };
            var subscription = new ClubSubscription()
            {
                ClubId = club.ClubId,
                Price  = 25,
                Name   = "Cheapies"
            };

            using (var context = _factory.CreateContext())
            {
                context.Clubs.Add(club);
                context.ClubSubscriptions.Add(subscription);
                context.SaveChanges();
            }


            //Act
            var request = new UpdateClubSubscriptionRequest()
            {
                Name  = "Supership++",
                Price = 50,
            };
            await _mutations.UpdateClubSubscriptionAsync(subscription.ClubSubscriptionId, request);

            //Assert
            using (var context = _factory.CreateContext())
            {
                var updatedSubscription = context.ClubSubscriptions.FirstOrDefault(subscription => subscription.Name == request.Name &&
                                                                                   subscription.Price == request.Price &&
                                                                                   subscription.ClubId == club.ClubId);
                Assert.That(updatedSubscription, Is.Not.Null);
                Assert.That(context.ClubSubscriptions.Count(), Is.EqualTo(1));
            }

            await _publish.Received(1).Publish(Arg.Any <ClubSubscriptionUpdatedEvent>());
        }
        public async Task Consume(ConsumeContext <ClubSubscriptionCreatedEvent> context)
        {
            var subscription = await _paymentContext.ClubSubscriptions.FindAsync(context.Message.ClubSubscriptionId);

            if (subscription == null)
            {
                Product product = _stripeService.CreateProduct(context.Message.ClubId, context.Message.Name);
                Price   price   = _stripeService.CreatePrice(context.Message.Price, product);
                subscription = new ClubSubscription()
                {
                    ClubSubscriptionId = context.Message.ClubSubscriptionId,
                    ClubId             = context.Message.ClubId,
                    StripePriceId      = price.Id,
                    StripeProductId    = product.Id,
                };
                await _paymentContext.ClubSubscriptions.AddAsync(subscription);

                await _paymentContext.SaveChangesAsync();
            }
        }
示例#11
0
        public void TryAuthenticate(string Ticket, string RemoteAddress)
        {
            using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
            {
                uint AuthedUid = SingleSignOnAuthenticator.TryAuthenticate(MySqlClient, Ticket, RemoteAddress);

                if (AuthedUid <= 0)
                {
                    SessionManager.StopSession(mId);
                    return;
                }

                CharacterInfo Info = CharacterInfoLoader.GetCharacterInfo(MySqlClient, AuthedUid, mId, true);

                if (Info == null || !Info.HasLinkedSession) // not marked online = CharacterInfoLoader failed somehow
                {
                    SessionManager.StopSession(mId);
                    return;
                }

                mCharacterInfo = Info;

                mAchieventCache = new AchievementCache(MySqlClient, CharacterId);
                mBadgeCache     = new BadgeCache(MySqlClient, CharacterId, mAchieventCache);

                if (!HasRight("login"))
                {
                    SessionManager.StopSession(mId);
                    return;
                }

                mCharacterInfo.TimestampLastOnline = UnixTimestamp.GetCurrent();

                CharacterResolverCache.AddToCache(mCharacterInfo.Id, mCharacterInfo.Username, true);

                mMessengerFriendCache = new SessionMessengerFriendCache(MySqlClient, CharacterId);
                mFavoriteRoomsCache   = new FavoriteRoomsCache(MySqlClient, CharacterId);
                mRatedRoomsCache      = new RatedRoomsCache();
                mInventoryCache       = new InventoryCache(MySqlClient, CharacterId);
                mIgnoreCache          = new UserIgnoreCache(MySqlClient, CharacterId);
                mNewItemsCache        = new NewItemsCache(MySqlClient, CharacterId);
                mAvatarEffectCache    = new AvatarEffectCache(MySqlClient, CharacterId);
                mQuestCache           = new QuestCache(MySqlClient, CharacterId);
                mPetCache             = new PetInventoryCache(MySqlClient, CharacterId);

                // Subscription manager
                MySqlClient.SetParameter("userid", CharacterId);
                DataRow Row = MySqlClient.ExecuteQueryRow("SELECT * FROM user_subscriptions WHERE user_id = @userid");

                mSubscriptionManager = (Row != null ? new ClubSubscription(CharacterId,
                                                                           (ClubSubscriptionLevel)int.Parse((Row["subscription_level"].ToString())), (double)Row["timestamp_created"],
                                                                           (double)Row["timestamp_expire"], (double)Row["past_time_hc"], (double)Row["past_time_vip"]) :
                                        new ClubSubscription(CharacterId, ClubSubscriptionLevel.None, 0, 0, 0, 0));

                if (mSubscriptionManager.SubscriptionLevel < ClubSubscriptionLevel.VipClub)
                {
                    mBadgeCache.DisableSubscriptionBadge("ACH_VipClub");
                }

                if (mSubscriptionManager.SubscriptionLevel < ClubSubscriptionLevel.BasicClub)
                {
                    mBadgeCache.DisableSubscriptionBadge("ACH_BasicClub");
                }

                mAvatarEffectCache.CheckEffectExpiry(this);

                mAuthProcessed = true;

                SendData(AuthenticationOkComposer.Compose());
                SendData(FuseRightsListComposer.Compose(this));
                SendData(UserHomeRoomComposer.Compose(mCharacterInfo.HomeRoom));
                SendData(UserEffectListComposer.Compose(AvatarEffectCache.Effects));
                SendData(NavigatorFavoriteRoomsComposer.Compose(FavoriteRoomsCache.FavoriteRooms));
                SendData(InventoryNewItemsComposer.Compose(NewItemsCache.NewItems));
                SendData(AchievementDataListComposer.Compose(AchievementManager.Achievements.Values.ToList()));

                SendData(AvailabilityStatusMessageComposer.Compose());
                SendData(InfoFeedEnableMessageComposer.Compose(1));
                SendData(ActivityPointsMessageComposer.Compose());

                if (HasRight("moderation_tool"))
                {
                    SendData(ModerationToolComposer.Compose(this, ModerationPresets.UserMessagePresets,
                                                            ModerationPresets.UserActionPresets, ModerationPresets.RoomMessagePresets));

                    foreach (ModerationTicket ModTicket in ModerationTicketManager.ActiveTickets)
                    {
                        SendData(ModerationTicketComposer.Compose(ModTicket));
                    }
                }

                MessengerHandler.MarkUpdateNeeded(this, 0, true);
            }
        }
示例#12
0
        public void TryAuthenticate(string Ticket, string RemoteAddress)
        {
            using (SqlDatabaseClient MySqlClient = SqlDatabaseManager.GetClient())
            {
                uint AuthedUid = SingleSignOnAuthenticator.TryAuthenticate(MySqlClient, Ticket, RemoteAddress);

                if (AuthedUid <= 0)
                {
                    SessionManager.StopSession(mId);
                    return;
                }

                CharacterInfo Info = CharacterInfoLoader.GetCharacterInfo(MySqlClient, AuthedUid, mId, true);

                if (Info == null || !Info.HasLinkedSession) // not marked online = CharacterInfoLoader failed somehow
                {
                    SessionManager.StopSession(mId);
                    return;
                }

                mCharacterInfo = Info;

                mAchieventCache = new AchievementCache(MySqlClient, CharacterId);
                mBadgeCache     = new BadgeCache(MySqlClient, CharacterId, mAchieventCache);

                if (!HasRight("login"))
                {
                    SessionManager.StopSession(mId);
                    return;
                }

                mCharacterInfo.TimestampLastOnline = UnixTimestamp.GetCurrent();

                CharacterResolverCache.AddToCache(mCharacterInfo.Id, mCharacterInfo.Username, true);

                mMessengerFriendCache = new SessionMessengerFriendCache(MySqlClient, CharacterId);
                mFavoriteRoomsCache   = new FavoriteRoomsCache(MySqlClient, CharacterId);
                mRatedRoomsCache      = new RatedRoomsCache();
                mInventoryCache       = new InventoryCache(MySqlClient, CharacterId);
                mIgnoreCache          = new UserIgnoreCache(MySqlClient, CharacterId);
                mNewItemsCache        = new NewItemsCache(MySqlClient, CharacterId);
                mAvatarEffectCache    = new AvatarEffectCache(MySqlClient, CharacterId);
                mQuestCache           = new QuestCache(MySqlClient, CharacterId);
                mPetCache             = new PetInventoryCache(MySqlClient, CharacterId);

                // Subscription manager
                MySqlClient.SetParameter("userid", CharacterId);
                DataRow Row = MySqlClient.ExecuteQueryRow("SELECT * FROM user_subscriptions WHERE user_id = @userid");

                mSubscriptionManager = (Row != null ? new ClubSubscription(CharacterId,
                                                                           (ClubSubscriptionLevel)int.Parse((Row["subscription_level"].ToString())), (double)Row["timestamp_created"],
                                                                           (double)Row["timestamp_expire"], (double)Row["past_time_hc"], (double)Row["past_time_vip"]) :
                                        new ClubSubscription(CharacterId, ClubSubscriptionLevel.None, 0, 0, 0, 0));

                if (mSubscriptionManager.SubscriptionLevel < ClubSubscriptionLevel.VipClub)
                {
                    mBadgeCache.DisableSubscriptionBadge("ACH_VipClub");
                }

                if (mSubscriptionManager.SubscriptionLevel < ClubSubscriptionLevel.BasicClub)
                {
                    mBadgeCache.DisableSubscriptionBadge("ACH_BasicClub");
                }

                mAvatarEffectCache.CheckEffectExpiry(this);

                mAuthProcessed = true;

                SendData(AuthenticationOkComposer.Compose());
                SendData(FuseRightsListComposer.Compose(this));
                SendData(UserHomeRoomComposer.Compose(mCharacterInfo.HomeRoom));
                SendData(UserEffectListComposer.Compose(AvatarEffectCache.Effects));
                SendData(NavigatorFavoriteRoomsComposer.Compose(FavoriteRoomsCache.FavoriteRooms));
                SendData(InventoryNewItemsComposer.Compose(NewItemsCache.NewItems));
                SendData(MessageOfTheDayComposer.Compose("Welcome to uberHotel.org BETA.\n\n\nThank you for participating in the uberHotel.org BETA test. We hope to gather relevant feedback and ideas to help make this hotel into a success.\n\nPlease submit any bugs, feedback, or ideas via:\nhttp://snowlight.uservoice.com\n\n\nHave fun, and thank you for joining us!"));
                SendData(AchievementDataListComposer.Compose(AchievementManager.Achievements.Values.ToList()));

                // This is available status packet (AvailabilityStatusMessageComposer)
                ServerMessage UnkMessage2 = new ServerMessage(290);
                UnkMessage2.AppendInt32(1);
                UnkMessage2.AppendInt32(0);
                SendData(UnkMessage2);

                // This is info feed packet (InfoFeedEnableMessageComposer)
                ServerMessage UnkMessage3 = new ServerMessage(517);
                UnkMessage3.AppendInt32(1); // 1 = enabled     0 = disabled  (true/false)
                SendData(UnkMessage3);

                // This is activity points message (ActivityPointsMessageComposer)  not sure how this is handled...
                ServerMessage UnkMessage4 = new ServerMessage(628);
                UnkMessage4.AppendInt32(1);
                UnkMessage4.AppendInt32(0);
                UnkMessage4.AppendInt32(2971);
                SendData(UnkMessage4);

                SendData(ClientConfigComposer.Compose(CharacterInfo.ConfigVolume, false));

                if (HasRight("moderation_tool"))
                {
                    SendData(ModerationToolComposer.Compose(this, ModerationPresets.UserMessagePresets,
                                                            ModerationPresets.UserActionPresets, ModerationPresets.RoomMessagePresets));

                    foreach (ModerationTicket ModTicket in ModerationTicketManager.ActiveTickets)
                    {
                        SendData(ModerationTicketComposer.Compose(ModTicket));
                    }
                }

                MessengerHandler.MarkUpdateNeeded(this, 0, true);
            }
        }