private async Task UpdateSubscribers()
        {
            this.userSubDates.Clear();
            foreach (UserWithGroupsModel userWithGroups in await ChannelSession.Connection.GetUsersWithRoles(ChannelSession.Channel, MixerRoleEnum.Subscriber))
            {
                DateTimeOffset?subDate = userWithGroups.GetSubscriberDate();
                if (subDate.HasValue)
                {
                    this.userSubDates[new UserViewModel(userWithGroups)] = subDate.GetValueOrDefault();
                }
            }

            List <OverlayListIndividualItemModel> items = new List <OverlayListIndividualItemModel>();

            var orderedUsers = this.userSubDates.OrderByDescending(kvp => kvp.Value.TotalDaysFromNow());

            for (int i = 0; i < this.TotalToShow && i < orderedUsers.Count(); i++)
            {
                var kvp = orderedUsers.ElementAt(i);

                OverlayListIndividualItemModel item = OverlayListIndividualItemModel.CreateAddItem(kvp.Key.UserName, kvp.Key, i + 1, this.HTML);
                item.Hash = kvp.Value.GetAge();
            }

            await this.AddLeaderboardItems(items);

            this.SendUpdateRequired();
        }
Exemple #2
0
        private async Task AddGameQueueUsers(IEnumerable <UserViewModel> users)
        {
            await this.listSemaphore.WaitAndRelease((System.Func <Task <int> >)(() =>
            {
                foreach (UserViewModel user in this.lastUsers)
                {
                    if (!users.Contains(user))
                    {
                        this.Items.Add(OverlayListIndividualItemModel.CreateRemoveItem(user.ID.ToString()));
                    }
                }

                for (int i = 0; i < users.Count() && i < this.TotalToShow; i++)
                {
                    UserViewModel user = users.ElementAt(i);

                    OverlayListIndividualItemModel item = OverlayListIndividualItemModel.CreateAddItem(user.ID.ToString(), user, i + 1, this.HTML);
                    item.TemplateReplacements.Add("USERNAME", (string)user.DisplayName);
                    item.TemplateReplacements.Add("POSITION", (i + 1).ToString());

                    this.Items.Add(item);
                }

                this.lastUsers = new List <UserViewModel>(users);

                this.SendUpdateRequired();
                return(Task.FromResult(0));
            }));
        }
        private async void GlobalEvents_OnDonationOccurred(object sender, UserDonationModel donation)
        {
            UserViewModel user = donation.User;

            if (!this.userDonations.ContainsKey(user))
            {
                this.userDonations[user]        = donation.Copy();
                this.userDonations[user].Amount = 0.0;
            }
            this.userDonations[user].Amount += donation.Amount;

            List <OverlayListIndividualItemModel> items = new List <OverlayListIndividualItemModel>();

            var orderedUsers = this.userDonations.OrderByDescending(kvp => kvp.Value.Amount);

            for (int i = 0; i < this.TotalToShow && i < orderedUsers.Count(); i++)
            {
                var kvp = orderedUsers.ElementAt(i);

                OverlayListIndividualItemModel item = OverlayListIndividualItemModel.CreateAddItem(kvp.Key.UserName, kvp.Key, i + 1, this.HTML);
                item.Hash = kvp.Value.AmountText;
            }

            await this.AddLeaderboardItems(items);

            this.SendUpdateRequired();
        }
Exemple #4
0
 private async void GlobalEvents_OnChatMessageDeleted(object sender, Guid id)
 {
     await this.listSemaphore.WaitAndRelease(() =>
     {
         OverlayListIndividualItemModel item = OverlayListIndividualItemModel.CreateRemoveItem(id.ToString());
         this.Items.Add(item);
         this.SendUpdateRequired();
         return(Task.FromResult(0));
     });
 }
Exemple #5
0
        private async void GlobalEvents_OnChatMessageReceived(object sender, ChatMessageViewModel message)
        {
            if (!message.IsAlert && !message.IsWhisper)
            {
                OverlayListIndividualItemModel item = OverlayListIndividualItemModel.CreateAddItem(message.ID.ToString(), message.User, -1, this.HTML);

                string text            = string.Empty;
                string messageTemplate = string.Empty;
                if (message.Skill != null || message.ChatSkill != null)
                {
                    item.TemplateReplacements.Add("MESSAGE", OverlayChatMessagesListItemModel.SkillImageMessageHTMLTemplate);
                    if (message.Skill != null)
                    {
                        item.TemplateReplacements.Add("IMAGE", message.Skill.ImageUrl);
                    }
                    else if (message.ChatSkill != null)
                    {
                        item.TemplateReplacements.Add("IMAGE", message.ChatSkill.icon_url);
                    }
                }
                else
                {
                    item.TemplateReplacements.Add("MESSAGE", OverlayChatMessagesListItemModel.TextMessageHTMLTemplate);

                    text = message.Message;
                    foreach (ChatMessageDataModel messageData in message.MessageComponents)
                    {
                        EmoticonImage emoticon = ChannelSession.GetEmoticonForMessage(messageData);
                        if (emoticon != null)
                        {
                            string emoticonText = OverlayChatMessagesListItemModel.EmoticonMessageHTMLTemplate;
                            emoticonText = emoticonText.Replace("{EMOTICON}", emoticon.Uri);
                            emoticonText = emoticonText.Replace("{EMOTICON_X}", (-emoticon.X).ToString());
                            emoticonText = emoticonText.Replace("{EMOTICON_Y}", (-emoticon.Y).ToString());
                            text         = text.Replace(messageData.text, emoticonText);
                        }
                    }
                    item.TemplateReplacements.Add("TEXT", text);
                }

                item.TemplateReplacements.Add("USERNAME", item.User.UserName);
                item.TemplateReplacements.Add("USER_IMAGE", item.User.AvatarLink);
                item.TemplateReplacements.Add("USER_COLOR", OverlayChatMessagesListItemModel.userColors[item.User.PrimaryRoleColorName]);
                item.TemplateReplacements.Add("SUB_IMAGE", (item.User.IsMixerSubscriber && ChannelSession.Channel.badge != null) ? ChannelSession.Channel.badge.url : string.Empty);
                item.TemplateReplacements.Add("TEXT_SIZE", this.Height.ToString());

                await this.listSemaphore.WaitAndRelease(() =>
                {
                    this.Items.Add(item);
                    this.SendUpdateRequired();
                    return(Task.FromResult(0));
                });
            }
        }
Exemple #6
0
        private async Task AddEvent(string details)
        {
            OverlayListIndividualItemModel item = OverlayListIndividualItemModel.CreateAddItem(Guid.NewGuid().ToString(), null, -1, this.HTML);

            item.TemplateReplacements.Add("DETAILS", details);

            await this.listSemaphore.WaitAndRelease(() =>
            {
                this.Items.Add(item);
                this.SendUpdateRequired();
                return(Task.FromResult(0));
            });
        }
Exemple #7
0
        private async Task ProcessLeaderboardItems(List <OverlayLeaderboardItem> items)
        {
            await this.listSemaphore.WaitAndRelease((Func <Task>)(async() =>
            {
                this.Items.Clear();

                List <OverlayListIndividualItemModel> updatedList = new List <OverlayListIndividualItemModel>();

                for (int i = 0; i < this.lastItems.Count(); i++)
                {
                    if (!items.Any(x => string.Equals(x.ID, this.lastItems[i].ID)))
                    {
                        this.Items.Add(OverlayListIndividualItemModel.CreateRemoveItem(this.lastItems[i].ID));
                    }
                }

                for (int i = 0; i < items.Count() && i < this.TotalToShow; i++)
                {
                    OverlayListIndividualItemModel newItem = OverlayListIndividualItemModel.CreateAddItem(items[i].ID, items[i].User, i + 1, this.HTML);
                    newItem.Hash = items[i].Hash;
                    newItem.TemplateReplacements.Add("USERNAME", newItem.ID);
                    newItem.TemplateReplacements.Add("DETAILS", newItem.Hash);
                    newItem.TemplateReplacements.Add("TOP_TEXT_HEIGHT", ((int)(0.4 * ((double)this.Height))).ToString());
                    newItem.TemplateReplacements.Add("BOTTOM_TEXT_HEIGHT", ((int)(0.2 * ((double)this.Height))).ToString());

                    updatedList.Add(newItem);
                    this.Items.Add(newItem);
                }

                if (this.LeaderChangedCommand != null)
                {
                    // Detect if we had a list before, and we have a list now, and the top user changed, let's trigger the event
                    if (this.lastItems.Count() > 0 && updatedList.Count() > 0)
                    {
                        UserViewModel previous = this.lastItems.First().GetUser();
                        UserViewModel current  = updatedList.First().GetUser();
                        if (previous != null && current != null && !previous.ID.Equals(current.ID))
                        {
                            await this.LeaderChangedCommand.Perform(new CommandParametersModel(current, new string[] { previous.Username })
                            {
                                TargetUser = previous
                            });
                        }
                    }
                }

                this.lastItems = new List <OverlayListIndividualItemModel>(updatedList);
            }));
        }
        private async Task AddEvent(string name, string details)
        {
            OverlayListIndividualItemModel item = OverlayListIndividualItemModel.CreateAddItem(name + details, null, -1, this.HTML);

            item.TemplateReplacements.Add("NAME", name);
            item.TemplateReplacements.Add("DETAILS", details);
            item.TemplateReplacements.Add("TOP_TEXT_HEIGHT", ((int)(0.4 * ((double)this.Height))).ToString());
            item.TemplateReplacements.Add("BOTTOM_TEXT_HEIGHT", ((int)(0.2 * ((double)this.Height))).ToString());

            await this.listSemaphore.WaitAndRelease(() =>
            {
                this.Items.Add(item);
                this.SendUpdateRequired();
                return(Task.FromResult(0));
            });
        }
        private async Task AddSongRequests(IEnumerable <SongRequestModel> songs)
        {
            await this.listSemaphore.WaitAndRelease(() =>
            {
                List <OverlayListIndividualItemModel> items = new List <OverlayListIndividualItemModel>();
                for (int i = 0; i < songs.Count() && i < this.TotalToShow; i++)
                {
                    SongRequestModel song = songs.ElementAt(i);
                    OverlayListIndividualItemModel item = OverlayListIndividualItemModel.CreateAddItem(song.ID.ToString(), song.User, i + 1, this.HTML);
                    item.TemplateReplacements.Add("SONG_NAME", song.Name);
                    item.TemplateReplacements.Add("SONG_IMAGE", song.AlbumImage);
                    item.TemplateReplacements.Add("SONG_IMAGE_SIZE", ((int)(0.8 * ((double)this.Height))).ToString());
                    items.Add(item);
                }

                foreach (OverlayListIndividualItemModel item in this.lastItems)
                {
                    if (!items.Any(i => i.ID.Equals(item.ID)))
                    {
                        this.Items.Add(OverlayListIndividualItemModel.CreateRemoveItem(item.ID));
                    }
                }

                for (int i = 0; i < items.Count() && i < this.TotalToShow; i++)
                {
                    OverlayListIndividualItemModel item = items.ElementAt(i);

                    OverlayListIndividualItemModel foundItem = this.lastItems.FirstOrDefault(oi => oi.ID.Equals(item.ID));
                    if (foundItem == null || foundItem.Position != item.Position)
                    {
                        this.Items.Add(item);
                    }
                }

                this.lastItems = new List <OverlayListIndividualItemModel>(items);

                this.SendUpdateRequired();
                return(Task.FromResult(0));
            });
        }
        private async Task AddLeaderboardItems(IEnumerable <OverlayListIndividualItemModel> items)
        {
            await this.listSemaphore.WaitAndRelease(async() =>
            {
                foreach (OverlayListIndividualItemModel item in this.lastItems)
                {
                    if (!items.Any(i => i.ID.Equals(item.ID)))
                    {
                        this.Items.Add(OverlayListIndividualItemModel.CreateRemoveItem(item.ID));
                    }
                }

                for (int i = 0; i < items.Count() && i < this.TotalToShow; i++)
                {
                    OverlayListIndividualItemModel item = items.ElementAt(i);

                    OverlayListIndividualItemModel foundItem = this.lastItems.FirstOrDefault(oi => oi.ID.Equals(item.ID));
                    if (foundItem == null || foundItem.Position != item.Position || !foundItem.Hash.Equals(item.Hash))
                    {
                        this.Items.Add(item);
                        item.TemplateReplacements.Add("USERNAME", item.ID);
                        item.TemplateReplacements.Add("DETAILS", item.Hash);
                        item.TemplateReplacements.Add("TOP_TEXT_HEIGHT", ((int)(0.4 * ((double)this.Height))).ToString());
                        item.TemplateReplacements.Add("BOTTOM_TEXT_HEIGHT", ((int)(0.2 * ((double)this.Height))).ToString());
                    }
                }

                if (this.NewLeaderCommand != null)
                {
                    // Detect if we had a list before, and we have a list now, and the top user changed, let's trigger the event
                    if (this.lastItems.Count() > 0 && items.Count() > 0 && !this.lastItems.First().User.ID.Equals(items.First().User.ID))
                    {
                        await this.NewLeaderCommand.Perform(items.First().User, new string[] { this.lastItems.First().User.UserName });
                    }
                }

                this.lastItems = new List <OverlayListIndividualItemModel>(items);
            });
        }
Exemple #11
0
        private async void GlobalEvents_OnChatMessageReceived(object sender, ChatMessageViewModel message)
        {
            if (!message.IsWhisper)
            {
                if (message is UserChatMessageViewModel)
                {
                    OverlayListIndividualItemModel item = OverlayListIndividualItemModel.CreateAddItem(message.ID.ToString(), message.User, -1, this.HTML);

                    List <string> textParts = new List <string>();
                    foreach (object messagePart in message.MessageParts)
                    {
                        string imageURL = null;
                        if (messagePart is string)
                        {
                            textParts.Add((string)messagePart);
                        }
                        else if (messagePart is EmoteModel)
                        {
                            imageURL = ((EmoteModel)messagePart).Size1URL;
                        }
                        else if (messagePart is BetterTTVEmoteModel)
                        {
                            imageURL = ((BetterTTVEmoteModel)messagePart).url;
                        }
                        else if (messagePart is FrankerFaceZEmoteModel)
                        {
                            imageURL = ((FrankerFaceZEmoteModel)messagePart).url;
                        }
                        else if (messagePart is TwitchBitsCheerViewModel)
                        {
                            imageURL = ((TwitchBitsCheerViewModel)messagePart).Tier.LightImage;
                        }

                        if (!string.IsNullOrEmpty(imageURL))
                        {
                            string imageText = OverlayChatMessagesListItemModel.ImageMessageHTMLTemplate;
                            imageText = imageText.Replace("{IMAGE}", imageURL);
                            textParts.Add(imageText);
                        }
                    }

                    UserViewModel user = item.GetUser();
                    if (user != null)
                    {
                        item.TemplateReplacements.Add("MESSAGE", OverlayChatMessagesListItemModel.TextMessageHTMLTemplate);
                        item.TemplateReplacements.Add("TEXT", string.Join(" ", textParts));
                        item.TemplateReplacements.Add("USERNAME", user.DisplayName);
                        item.TemplateReplacements.Add("USER_IMAGE", user.AvatarLink);
                        item.TemplateReplacements.Add("USER_COLOR", user.Color);
                        item.TemplateReplacements.Add("SUB_IMAGE", string.Empty);
                        item.TemplateReplacements.Add("TEXT_SIZE", this.Height.ToString());
                    }

                    await this.listSemaphore.WaitAndRelease(() =>
                    {
                        this.Items.Add(item);
                        this.SendUpdateRequired();
                        return(Task.FromResult(0));
                    });
                }
            }
        }
        public override async Task <JObject> GetProcessedItem(UserViewModel user, IEnumerable <string> arguments, Dictionary <string, string> extraSpecialIdentifiers)
        {
            List <OverlayListIndividualItemModel> items = new List <OverlayListIndividualItemModel>();

            if (this.LeaderboardType == OverlayLeaderboardListItemTypeEnum.CurrencyRank)
            {
                if (ChannelSession.Settings.Currencies.ContainsKey(this.CurrencyID))
                {
                    UserCurrencyViewModel currency = ChannelSession.Settings.Currencies[this.CurrencyID];
                    Dictionary <UserDataViewModel, int> currencyAmounts = new Dictionary <UserDataViewModel, int>();
                    foreach (UserDataViewModel userData in ChannelSession.Settings.UserData.Values)
                    {
                        currencyAmounts[userData] = userData.GetCurrencyAmount(currency);
                    }

                    var orderedUsers = currencyAmounts.OrderByDescending(kvp => kvp.Value);
                    for (int i = 0; i < this.TotalToShow && i < orderedUsers.Count(); i++)
                    {
                        var kvp = orderedUsers.ElementAt(i);

                        OverlayListIndividualItemModel item = OverlayListIndividualItemModel.CreateAddItem(kvp.Key.UserName, new UserViewModel(kvp.Key), i + 1, this.HTML);
                        item.Hash = kvp.Value.ToString();
                        items.Add(item);
                    }
                }
            }
            else if (this.LeaderboardType == OverlayLeaderboardListItemTypeEnum.Sparks)
            {
                IEnumerable <SparksLeaderboardModel> sparkLeaderboard = null;
                switch (this.LeaderboardDateRange)
                {
                case OverlayLeaderboardListItemDateRangeEnum.Weekly:
                    sparkLeaderboard = await ChannelSession.Connection.GetWeeklySparksLeaderboard(ChannelSession.Channel, this.TotalToShow);

                    break;

                case OverlayLeaderboardListItemDateRangeEnum.Monthly:
                    sparkLeaderboard = await ChannelSession.Connection.GetMonthlySparksLeaderboard(ChannelSession.Channel, this.TotalToShow);

                    break;

                case OverlayLeaderboardListItemDateRangeEnum.Yearly:
                    sparkLeaderboard = await ChannelSession.Connection.GetYearlySparksLeaderboard(ChannelSession.Channel, this.TotalToShow);

                    break;

                case OverlayLeaderboardListItemDateRangeEnum.AllTime:
                    sparkLeaderboard = await ChannelSession.Connection.GetAllTimeSparksLeaderboard(ChannelSession.Channel, this.TotalToShow);

                    break;
                }

                if (sparkLeaderboard != null)
                {
                    for (int i = 0; i < this.TotalToShow && i < sparkLeaderboard.Count(); i++)
                    {
                        var sl = sparkLeaderboard.ElementAt(i);

                        OverlayListIndividualItemModel item = OverlayListIndividualItemModel.CreateAddItem(sl.username, null, i + 1, this.HTML);
                        item.Hash = sl.statValue.ToString();
                        items.Add(item);
                    }
                }
            }
            else if (this.LeaderboardType == OverlayLeaderboardListItemTypeEnum.Embers)
            {
                IEnumerable <EmbersLeaderboardModel> emberLeaderboard = null;
                switch (this.LeaderboardDateRange)
                {
                case OverlayLeaderboardListItemDateRangeEnum.Weekly:
                    emberLeaderboard = await ChannelSession.Connection.GetWeeklyEmbersLeaderboard(ChannelSession.Channel, this.TotalToShow);

                    break;

                case OverlayLeaderboardListItemDateRangeEnum.Monthly:
                    emberLeaderboard = await ChannelSession.Connection.GetMonthlyEmbersLeaderboard(ChannelSession.Channel, this.TotalToShow);

                    break;

                case OverlayLeaderboardListItemDateRangeEnum.Yearly:
                    emberLeaderboard = await ChannelSession.Connection.GetYearlyEmbersLeaderboard(ChannelSession.Channel, this.TotalToShow);

                    break;

                case OverlayLeaderboardListItemDateRangeEnum.AllTime:
                    emberLeaderboard = await ChannelSession.Connection.GetAllTimeEmbersLeaderboard(ChannelSession.Channel, this.TotalToShow);

                    break;
                }

                if (emberLeaderboard != null)
                {
                    for (int i = 0; i < this.TotalToShow && i < emberLeaderboard.Count(); i++)
                    {
                        var sl = emberLeaderboard.ElementAt(i);

                        OverlayListIndividualItemModel item = OverlayListIndividualItemModel.CreateAddItem(sl.username, null, i + 1, this.HTML);
                        item.Hash = sl.statValue.ToString();
                        items.Add(item);
                    }
                }
            }

            if (items.Count > 0)
            {
                await this.AddLeaderboardItems(items);
            }

            return(await base.GetProcessedItem(user, arguments, extraSpecialIdentifiers));
        }