Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
            }
        }