public void OnBattleEnd() { foreach (KeyValuePair <Guild, VvVGuildBattleStats> kvp in Battle.GuildStats) { Guild g = kvp.Key; if (!GuildStats.ContainsKey(g)) { GuildStats[g] = new VvVGuildStats(g); } int score = (int)kvp.Value.Points; GuildStats[g].Kills += kvp.Value.Kills; GuildStats[g].ReturnedSigils += kvp.Value.ReturnedSigils; GuildStats[g].Score += score; List <Mobile> list = g.Members.Where(mob => mob.NetState != null && mob.Region.IsPartOf(Battle.Region)).ToList(); foreach (Mobile m in list) { VvVPlayerEntry entry = GetPlayerEntry <VvVPlayerEntry>(m, true); if (entry != null) { entry.Score += score; } } } }
public void CheckOccupation() { if (!OnGoing) { return; } if (Participants.Count == 1) { Guild g = Participants[0]; if (!GuildStats.ContainsKey(g)) { GuildStats[g] = new VvVGuildBattleStats(g); } GuildStats[g].Points += OccupyPoints; UpdateAllGumps(); CheckScore(); if (OnGoing && NextAnnouncement < DateTime.UtcNow) { System.SendVvVMessage(1154957, g.Name); // ~1_NAME~ is occupying the city! NextAnnouncement = DateTime.UtcNow + TimeSpan.FromMinutes(Announcement); } } else // Is this a bug? Verified on EA this is how it behaves { if (NextAnnouncement < DateTime.UtcNow) { System.SendVvVMessage(1154958); // The City is unoccupied! Slay opposing forces to claim the city for your guild! NextAnnouncement = DateTime.UtcNow + TimeSpan.FromMinutes(Announcement); } } }
public VvVGuildBattleStats GetGuildStats(Guild g) { if (g == null) { return(null); } if (!GuildStats.ContainsKey(g)) { GuildStats[g] = new VvVGuildBattleStats(g); } return(GuildStats[g]); }
public ResultsPage(GuildStats stats) { InitializeComponent(); DataContext = stats; if (stats.MemberStats.Any()) { Dictionary <string, long> dictionary = new Dictionary <string, long>(); foreach (var item in stats.MemberStats) { dictionary.Add(item.Username, item.SentMessages); } ((PieSeries)leaderboardsPie.Series[0]).ItemsSource = dictionary.OrderByDescending(t => t.Value); ((PieSeries)accountedForPie.Series[0]).ItemsSource = new Dictionary <string, int>() { ["Accounted"] = stats.MessagesAccountedFor, ["Unaccounted"] = stats.TotalMessages - stats.MessagesAccountedFor }; } }
/// <summary> /// Gets real time leader of battle, out parameter of their score /// </summary> /// <param name="score"></param> /// <returns></returns> public Guild GetLeader(out int score) { Guild leader = null; score = 0; foreach (Guild g in Participants) { if (!GuildStats.ContainsKey(g)) { GuildStats[g] = new VvVGuildBattleStats(g); } if (leader == null || GuildStats[g].Points > score) { leader = g; score = (int)GuildStats[g].Points; } } return(leader); }
public void EndBattle() { EndTimer(); if (Region is GuardedRegion) { ((GuardedRegion)Region).Disabled = false; } CooldownEnds = DateTime.UtcNow + TimeSpan.FromMinutes(Cooldown); ViceVsVirtueSystem.Instance.OnBattleEnd(); foreach (VvVAltar altar in Altars) { if (!altar.Deleted) { altar.Delete(); } } foreach (VvVTrap trap in Traps) { if (!trap.Deleted) { trap.Delete(); } } foreach (CannonTurret turret in Turrets) { if (!turret.Deleted) { turret.Delete(); } } if (VicePriest != null) { VicePriest.Delete(); VicePriest = null; } if (VirtuePriest != null) { VirtuePriest.Delete(); VirtuePriest = null; } if (Sigil != null) { Sigil.Delete(); Sigil = null; } Guild leader = GetLeader(); foreach (Mobile m in this.Region.GetEnumeratedMobiles()) { Guild g = m.Guild as Guild; if (leader != null && (g == leader || leader.IsAlly(g))) { System.AwardPoints(m, WinSilver + (OppositionCount(g) * 50), message: false); } } SendBattleStatsGump(); System.SendVvVMessage(1154722); // A VvV battle has just concluded. The next battle will begin in less than five minutes! Altars.Clear(); GuildStats.Clear(); KillCooldown.Clear(); Participants.Clear(); Participants.TrimExcess(); Messages.Clear(); Messages.TrimExcess(); Traps.Clear(); Traps.TrimExcess(); Warned.Clear(); Warned.TrimExcess(); Turrets.Clear(); Turrets.TrimExcess(); if (Region is GuardedRegion) { ((GuardedRegion)Region).Disabled = false; } OnGoing = false; NextSigilSpawn = DateTime.MinValue; LastOccupationCheck = DateTime.MinValue; NextAnnouncement = DateTime.MinValue; StartTime = DateTime.MinValue; NextAltarActivate = DateTime.MinValue; ManaSpikeEndEffects = DateTime.MinValue; NextManaSpike = DateTime.MinValue; }
private async void run_Click(object sender, RoutedEventArgs e) { StatsConfig conf = DataContext as StatsConfig; guildName.Text = conf.Guild.Name; preRunContent.Visibility = Visibility.Collapsed; runContent.Visibility = Visibility.Visible; GuildStats stats = new GuildStats(conf.Guild); StringBuilder strBuilder = new StringBuilder(); if (selectAllChannels.IsChecked != false) { foreach (var channel in selectedChannels.SelectedItems.Cast <DiscordChannel>()) { strBuilder.Append($"&channel_id={channel.Id}"); } } string append = strBuilder.ToString(); string initialResult = await _httpClient.GetStringAsync($"https://discordapp.com/api/v7/guilds/{conf.Guild.Id}/messages/search?include_nsfw=true" + append); stats.TotalMessages = GetCount(initialResult); if (conf.UserMentionCounts == true || conf.UserMessageCounts == true) { await SetStatus("Retrieving members... (This may take a while)"); var members = (await conf.Guild.GetAllMembersAsync()).OrderBy(m => m.Username).ToList(); if (selectAllRoles.IsChecked != true) { members.RemoveAll(m => !m.Roles.Any(r => selectedRoles.SelectedItems.Contains(r))); } var users = members.Cast <DiscordUser>().ToList(); if (conf.IncludeBannedUsers == true) { await SetStatus("Retrieving bans... (This may take a while)"); var bans = await conf.Guild.GetBansAsync(); users.AddRange(bans.Select(b => b.User)); } Stopwatch watch = new Stopwatch(); TimeSpan timeSpan = default; watch.Start(); for (int i = 0; i < users.Count; i++) { var m = users.ElementAt(i); await SetStatus($"Searching for @{m.Username}#{m.Discriminator}", $"{i + 1}/{users.Count} - {timeSpan:mm\\:ss} remaining", i, users.Count); var mstats = new MemberStats(m, stats.TotalMessages); if (conf.UserMessageCounts == true) { try { string sentResult = await _httpClient.GetStringAsync($"https://discordapp.com/api/v7/guilds/{conf.Guild.Id}/messages/search?author_id={m.Id}&include_nsfw=true" + append); mstats.SentMessages = GetCount(sentResult); stats.MessagesAccountedFor += mstats.SentMessages; var array = JObject.Parse(sentResult)["messages"].FirstOrDefault(); if (array != null) { var message = array.ElementAtOrDefault(1) ?? array.ElementAtOrDefault(0); if (message != null) { mstats.LastMessage = message["timestamp"].ToObject <DateTimeOffset>().ToUniversalTime(); } } if (conf.BanMeDaddy != false) { await Task.Delay(100); } } catch (Exception ex) { HandleError(ex); continue; } } if (conf.UserMentionCounts == true) { try { string sentResult = await _httpClient.GetStringAsync($"https://discordapp.com/api/v7/guilds/{conf.Guild.Id}/messages/search?mentions={m.Id}&include_nsfw=true" + append); mstats.Mentions = GetCount(sentResult); if (conf.BanMeDaddy != false) { await Task.Delay(100); } } catch (Exception ex) { HandleError(ex); continue; } } timeSpan = TimeSpan.FromTicks((watch.Elapsed.Ticks / (i + 1)) * (users.Count - i)); stats.MemberStats.Add(mstats); } } if (conf.ChannelMessageCounts == true) { DiscordMember currentMember = conf.Guild.CurrentMember; configureGrid.Visibility = Visibility.Visible; var channels = conf.Guild.Channels .Where(c => c.PermissionsFor(currentMember).HasFlag(Permissions.AccessChannels)) .Where(c => c.Type == ChannelType.Text) .OrderBy(c => c.Position).ToList(); for (int i = 0; i < channels.Count; i++) { DiscordChannel c = channels.ElementAt(i); await SetStatus($"Getting message count for #{c.Name}", $"{i + 1}/{channels.Count}", i, channels.Count); ChannelStats channelStat = new ChannelStats(c); string result = await _httpClient.GetStringAsync($"https://discordapp.com/api/v7/guilds/{conf.Guild.Id}/messages/search?channel_id={c.Id}&include_nsfw=true"); channelStat.Messages = GetCount(result); stats.ChannelStats.Add(channelStat); if (conf.BanMeDaddy != false) { await Task.Delay(100); } } } await Dispatcher.InvokeAsync(() => { runContent.Visibility = Visibility.Collapsed; resultsContent.Visibility = Visibility.Visible; resultsContent.Navigate(new ResultsPage(stats)); }); }
public static void ToExcel(GuildStats stats) { using (CommonSaveFileDialog dialog = new CommonSaveFileDialog()) { dialog.Filters.Add(new CommonFileDialogFilter("Excel file", ".xlsx")); if (dialog.ShowDialog() == CommonFileDialogResult.Ok) { Ookii.Dialogs.Wpf.TaskDialog progressDialog = new Ookii.Dialogs.Wpf.TaskDialog { Content = $"Exporting to \"{Path.GetFileName(dialog.FileName)}.xlsx\"", AllowDialogCancellation = false, WindowTitle = "Exporting to Excel" }; progressDialog.Buttons.Add(new Ookii.Dialogs.Wpf.TaskDialogButton(Ookii.Dialogs.Wpf.ButtonType.Cancel)); progressDialog.ProgressBarState = Ookii.Dialogs.Wpf.ProgressBarState.Normal; progressDialog.ProgressBarStyle = Ookii.Dialogs.Wpf.ProgressBarStyle.MarqueeProgressBar; progressDialog.ProgressBarMaximum = stats.MemberStats.Count() + stats.ChannelStats.Count(); new Thread(() => { try { Application app = new Application(); Workbook workbook = app.Workbooks.Add(); Worksheet memberSheet = workbook.Sheets.Add(); try { App.Current.Dispatcher.Invoke(() => progressDialog.ProgressBarStyle = Ookii.Dialogs.Wpf.ProgressBarStyle.ProgressBar); memberSheet.Name = "Members"; memberSheet.Cells[1, 1] = "Id"; memberSheet.Cells[1, 2] = "Username"; memberSheet.Cells[1, 3] = "Sent Messages"; memberSheet.Cells[1, 4] = "Mentions"; memberSheet.Cells[1, 5] = "Avg Messages / Day"; memberSheet.Cells[1, 6] = "Last Message"; for (int i = 0; i < stats.MemberStats.Count(); i++) { MemberStats stat = stats.MemberStats.ElementAt(i); memberSheet.Cells[i + 2, 1] = stat.Id.ToString(); memberSheet.Cells[i + 2, 2] = stat.Username.Trim('='); memberSheet.Cells[i + 2, 3] = stat.SentMessages; memberSheet.Cells[i + 2, 4] = stat.Mentions; memberSheet.Cells[i + 2, 5] = stat.AvgMessagesPerDay; memberSheet.Cells[i + 2, 6] = stat.LastMessage.ToString(); if ((i % 3) == 0) { App.Current.Dispatcher.Invoke(() => { try { progressDialog.ProgressBarValue = (progressDialog.ProgressBarValue + 3); } catch { } }); } } Worksheet channelsSheet = workbook.Sheets.Add(); channelsSheet.Name = "Channels"; channelsSheet.Cells[1, 1] = "Id"; channelsSheet.Cells[1, 2] = "Name"; channelsSheet.Cells[1, 3] = "Message Count"; channelsSheet.Cells[1, 4] = "Avg Messages / Day"; for (int i = 0; i < stats.ChannelStats.Count(); i++) { ChannelStats stat = stats.ChannelStats.ElementAt(i); channelsSheet.Cells[i + 2, 1] = stat.Id.ToString(); channelsSheet.Cells[i + 2, 2] = stat.Name.Trim('='); channelsSheet.Cells[i + 2, 3] = stat.Messages; channelsSheet.Cells[i + 2, 4] = stat.AvgMessagesPerDay; App.Current.Dispatcher.Invoke(() => { try { progressDialog.ProgressBarValue = (progressDialog.ProgressBarValue + 1); } catch { } }); } } finally { workbook.SaveAs(dialog.FileName); workbook.Close(); app.Quit(); App.Current.Dispatcher.Invoke(() => progressDialog.Dispose()); } } catch (Exception ex) { MainWindow.ShowTaskDialog($"Something went wrong exporting to Excel and an {ex.GetType().Name} occured.", Ookii.Dialogs.Wpf.TaskDialogIcon.Error); App.Current.Dispatcher.Invoke(() => progressDialog.Dispose()); } }).Start(); progressDialog.Show(); } } }