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