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>()); }
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>()); }
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); }
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>()); }
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); }
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>()); }
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(); } }
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(); } }
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(); } }
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); } }
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); } }