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]);
        }
Beispiel #4
0
        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;
        }
Beispiel #7
0
        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));
            });
        }
Beispiel #8
0
        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();
                }
            }
        }