private async Task ProcessGiftedSub(TwitchGiftedSubEventModel giftedSubEvent, bool fireEventCommand = true) { ChannelSession.Settings.LatestSpecialIdentifiersData[SpecialIdentifierStringBuilder.LatestSubscriberUserData] = giftedSubEvent.Receiver.ID; ChannelSession.Settings.LatestSpecialIdentifiersData[SpecialIdentifierStringBuilder.LatestSubscriberSubMonthsData] = giftedSubEvent.MonthsGifted; giftedSubEvent.Receiver.Data.TwitchSubscribeDate = DateTimeOffset.Now; foreach (CurrencyModel currency in ChannelSession.Settings.Currency.Values) { for (int i = 0; i < giftedSubEvent.MonthsGifted; i++) { currency.AddAmount(giftedSubEvent.Gifter.Data, currency.OnSubscribeBonus); } } giftedSubEvent.Gifter.Data.TotalSubsGifted += (uint)giftedSubEvent.MonthsGifted; giftedSubEvent.Receiver.Data.TotalSubsReceived += (uint)giftedSubEvent.MonthsGifted; giftedSubEvent.Receiver.Data.TotalMonthsSubbed += (uint)giftedSubEvent.MonthsGifted; if (fireEventCommand) { EventTrigger trigger = new EventTrigger(EventTypeEnum.TwitchChannelSubscriptionGifted, giftedSubEvent.Gifter); trigger.SpecialIdentifiers["usersubplanname"] = giftedSubEvent.PlanName; trigger.SpecialIdentifiers["usersubplan"] = giftedSubEvent.PlanTier; trigger.SpecialIdentifiers["usersubmonthsgifted"] = giftedSubEvent.MonthsGifted.ToString(); trigger.SpecialIdentifiers["isanonymous"] = giftedSubEvent.IsAnonymous.ToString(); trigger.Arguments.Add(giftedSubEvent.Receiver.Username); await ChannelSession.Services.Events.PerformEvent(trigger); await ChannelSession.Services.Alerts.AddAlert(new AlertChatMessageViewModel(StreamingPlatformTypeEnum.Twitch, giftedSubEvent.Gifter, string.Format("{0} Gifted A {1} Subscription To {2}", giftedSubEvent.Gifter.Username, giftedSubEvent.PlanTier, giftedSubEvent.Receiver.Username), ChannelSession.Settings.AlertGiftedSubColor)); } GlobalEvents.SubscriptionGiftedOccurred(giftedSubEvent.Gifter, giftedSubEvent.Receiver); }
private async Task BackgroundGiftedSubProcessor() { Dictionary <Guid, List <TwitchGiftedSubEventModel> > giftedSubs = new Dictionary <Guid, List <TwitchGiftedSubEventModel> >(); List <TwitchMassGiftedSubEventModel> massGiftedSubs = new List <TwitchMassGiftedSubEventModel>(); List <TwitchGiftedSubEventModel> tempGiftedSubs = new List <TwitchGiftedSubEventModel>(); List <TwitchMassGiftedSubEventModel> tempMassGiftedSubs = new List <TwitchMassGiftedSubEventModel>(); do { await Task.Delay(BackgroundGiftedSubProcessorTime); lock (this.newGiftedSubTracker) { tempGiftedSubs = this.newGiftedSubTracker.ToList(); this.newGiftedSubTracker.Clear(); } lock (this.newMassGiftedSubTracker) { tempMassGiftedSubs = this.newMassGiftedSubTracker.ToList(); this.newMassGiftedSubTracker.Clear(); } foreach (var group in tempGiftedSubs.GroupBy(s => s.Gifter.ID, s => s)) { Guid id = group.First().IsAnonymous ? Guid.Empty : group.Key; if (!giftedSubs.ContainsKey(id)) { giftedSubs[id] = new List <TwitchGiftedSubEventModel>(); } giftedSubs[id].AddRange(group.OrderBy(s => s.Processed)); } massGiftedSubs.AddRange(tempMassGiftedSubs.OrderBy(s => s.Processed)); } while (tempGiftedSubs.Count > 0 || tempMassGiftedSubs.Count > 0); giftedSubProcessorTask = null; foreach (TwitchMassGiftedSubEventModel massGiftedSub in massGiftedSubs) { Guid gifterID = (massGiftedSub.IsAnonymous) ? Guid.Empty : massGiftedSub.Gifter.ID; if (giftedSubs.ContainsKey(gifterID)) { for (int i = 0; i < massGiftedSub.TotalGifted && giftedSubs[gifterID].Count > 0; i++) { TwitchGiftedSubEventModel giftedSub = giftedSubs[gifterID][0]; giftedSubs[gifterID].Remove(giftedSub); await ProcessGiftedSub(giftedSub, fireEventCommand : false); } } await ProcessMassGiftedSub(massGiftedSub); } foreach (TwitchGiftedSubEventModel giftedSub in giftedSubs.SelectMany(kvp => kvp.Value)) { await ProcessGiftedSub(giftedSub); } }
private async void PubSub_OnSubscriptionsGiftedReceived(object sender, PubSubSubscriptionsGiftEventModel packet) { UserViewModel gifter = packet.IsAnonymousGiftedSubscription ? new UserViewModel("An Anonymous Gifter") : ChannelSession.Services.User.GetUserByTwitchID(packet.user_id); if (gifter == null) { gifter = new UserViewModel(packet); } UserViewModel receiver = ChannelSession.Services.User.GetUserByTwitchID(packet.recipient_id); if (receiver == null) { receiver = new UserViewModel(new UserModel() { id = packet.recipient_id, login = packet.recipient_user_name, display_name = packet.recipient_display_name }); } TwitchGiftedSubEventModel giftedSubEvent = new TwitchGiftedSubEventModel(gifter, receiver, packet); if (ChannelSession.Settings.TwitchMassGiftedSubsFilterAmount > 0) { lock (this.newGiftedSubTracker) { this.newGiftedSubTracker.Add(giftedSubEvent); } if (giftedSubProcessorTask == null) { giftedSubProcessorTask = Task.Run(BackgroundGiftedSubProcessor); } } else { await ProcessGiftedSub(giftedSubEvent); } }