public static Server MakeMegaServer()
 {
     Server retVal = new Server();
     foreach (Server srv in Servers.List.Values)
     {
         foreach (Character ch in srv.RecentCharacters)
         {
             if (!retVal.RecentCharacters.Contains(ch))
             {
                 retVal.RecentCharacters.Add(ch);
             }
         }
         foreach (Player pl in srv.RecentPlayers)
         {
             if (!retVal.RecentPlayers.Contains(pl))
             {
                 retVal.RecentPlayers.Add(pl);
             }
         }
         foreach (Player dm in srv.RecentDMs)
         {
             if (!retVal.RecentDMs.Contains(dm))
             {
                 retVal.RecentDMs.Add(dm);
             }
         }
     }
     return retVal;
 }
        public ServerView(Server server)
        {
            this.Paint += new PaintEventHandler(ServerView_Paint);

            Dictionary<uint, Log> serverEnforcementLogs = new Dictionary<uint, Log>();
            Dictionary<uint, Log> serverAdvancementLogs = new Dictionary<uint, Log>();
            Dictionary<uint, Log> serverDeathLogs = new Dictionary<uint, Log>();
            if (server == null)
            {
                server = MakeMegaServer();
                serverEnforcementLogs = Logs.EnforcementAlerts;
                serverAdvancementLogs = Logs.AdvancementAlerts;
                serverDeathLogs = Logs.DeathAlerts;
                this.Name = String.Format("All ALFA ({0} Characters, {1} DMs, {2} Alerts)", server.RecentCharacters.Count, server.RecentDMs.Count, serverEnforcementLogs.Count + serverAdvancementLogs.Count + serverDeathLogs.Count);
                this.Text = this.Name;
            }
            else
            {
                foreach (Log log in Logs.EnforcementAlerts.Values)
                {
                    if (log.ServerId == server.ServerId)
                    {
                        serverEnforcementLogs.Add(log.Id, log);
                    }
                }
                foreach (Log log in Logs.AdvancementAlerts.Values)
                {
                    if (log.ServerId == server.ServerId)
                    {
                        serverAdvancementLogs.Add(log.Id, log);
                    }
                }
                foreach (Log log in Logs.DeathAlerts.Values)
                {
                    if (log.ServerId == server.ServerId)
                    {
                        serverDeathLogs.Add(log.Id, log);
                    }
                }
                this.Name = String.Format("ALFA{0:000} ({1} Characters, {2} DMs, {3} Alerts)", server.ServerId, server.RecentCharacters.Count, server.RecentDMs.Count, serverEnforcementLogs.Count + serverAdvancementLogs.Count + serverDeathLogs.Count);
                this.Text = this.Name;
            }
            savedServer = server;

            characterListLabel.Text = "Characters Played in the Last 30 Days";
            characterListLabel.Size = characterListLabel.PreferredSize;
            characterListLabel.Location = new Point(0, 0);

            characterList.View = View.Details;
            dmList.View = View.Details;
            enforcementList.View = View.Details;
            advancementList.View = View.Details;
            deathList.View = View.Details;

            characterList.FullRowSelect = true;
            dmList.FullRowSelect = true;
            enforcementList.FullRowSelect = true;
            advancementList.FullRowSelect = true;
            deathList.FullRowSelect = true;

            characterList.DoubleClick += DoubleClickCharacterList;
            dmList.DoubleClick += DoubleClickDMList;
            enforcementList.DoubleClick += DoubleClickEnforcementList;
            advancementList.DoubleClick += DoubleClickAdvancementList;
            deathList.DoubleClick += DoubleClickDeathList;

            characterList.ColumnClick += ColumnSort;
            dmList.ColumnClick += ColumnSort;
            enforcementList.ColumnClick += ColumnSort;
            advancementList.ColumnClick += ColumnSort;
            deathList.ColumnClick += ColumnSort;

            characterList.Width = 550;
            characterList.Height = 440;
            characterList.Columns.Add("Character");
            characterList.Columns.Add("Player");
            characterList.Columns.Add("Class");
            characterList.Columns.Add("DMtime");
            characterList.Columns.Add("Alerts");
            characterList.Location = new Point(0, characterListLabel.Location.Y + characterListLabel.Height);
            foreach (Character currentChar in server.RecentCharacters)
            {
                if (currentChar.IsPlayable == false)
                {
                    continue;
                }
                if ((currentChar.Status & 0x001) == 0x001) // dead
                {
                    continue;
                }
                string charClass = PlayerDetails.ClassToAbbreviation(currentChar.Class1) + currentChar.Level1;
                if (currentChar.Class2 < 255)
                {
                    charClass += "/" + PlayerDetails.ClassToAbbreviation(currentChar.Class2) + currentChar.Level2;
                }
                if (currentChar.Class3 < 255)
                {
                    charClass += "/" + PlayerDetails.ClassToAbbreviation(currentChar.Class3) + currentChar.Level3;
                }
                string alerts = "";
                WealthLevel currentWeath = InfoGather.GetWealthLevel(currentChar);
                if (currentWeath == WealthLevel.VeryPoor)
                {
                    alerts += "Poor!";
                }
                else if (currentWeath == WealthLevel.VeryRich)
                {
                    alerts += "Rich!";
                }
                else if (currentWeath == WealthLevel.Cutoff)
                {
                    alerts += "CUTOFF WEALTH!";
                }
                string aliases = "";
                try
                {
                    foreach (string alias in Players.ListByPlayerId[currentChar.PlayerId].CommunityIds)
                    {
                        if (aliases == "")
                        {
                            aliases = alias;
                        }
                        else
                        {
                            aliases += "/ " + alias;
                        }
                    }
                }
                catch
                {
                    aliases = "Unknown player";
                }
                characterList.Items.Add(new ListViewItem(new string[] { currentChar.Name, aliases, charClass, String.Format("{0:N1}", currentChar.DMTime), alerts, currentChar.Id.ToString() }));
            }
            characterList.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
            characterList.Columns[1].Width = 150;
            characterList.Columns[2].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
            characterList.Columns[3].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
            characterList.Columns[4].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);

            dmListLabel.Text = "DMs Logging in During the Last 30 Days";
            dmListLabel.Size = dmListLabel.PreferredSize;
            dmListLabel.Location = new Point(0, characterList.Location.Y + characterList.Height + 10);

            dmList.Width = characterList.Width;
            dmList.Height = 250;
            dmList.Location = new Point(0, dmListLabel.Location.Y + dmListLabel.Height);
            dmList.Columns.Add("DM Community Ids");
            dmList.Columns[0].Width = 400;
            foreach (Player dm in server.RecentDMs)
            {
                string name = "";
                foreach (string gsid in dm.CommunityIds)
                {
                    if (name == "")
                    {
                        name = gsid;
                    }
                    else
                    {
                        name += "/ " + gsid;
                    }
                }
                dmList.Items.Add(new ListViewItem(new string[] { name, dm.playerIds[0].ToString() }));
            }
            dmList.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);

            enforcementListLabel.Text = "Enforcement Alerts";
            enforcementListLabel.Size = enforcementListLabel.PreferredSize;
            enforcementListLabel.Location = new Point(characterList.Width + 10, 0);

            enforcementList.Width = 340;
            enforcementList.Height = 200;
            enforcementList.Location = new Point(characterList.Width + 10, enforcementListLabel.Location.Y + enforcementListLabel.Height);
            enforcementList.Columns.Add("Character");
            enforcementList.Columns.Add("Time");
            enforcementList.Columns.Add("Event");
            foreach (Log log in serverEnforcementLogs.Values)
            {
                string character = "Unknown Character";
                if (log.CharacterId > 0 && Characters.List.Keys.Contains(log.CharacterId)) character = Characters.List[log.CharacterId].Name;
                enforcementList.Items.Add(new ListViewItem(new string[] { character, String.Format("{0}/{1}/{2}", log.Time.Year, log.Time.Month, log.Time.Day), log.Event, log.Id.ToString() }));
            }
            enforcementList.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
            enforcementList.Columns[1].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
            enforcementList.Columns[2].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);

            advancementListLabel.Text = "Advancement Alerts";
            advancementListLabel.Size = advancementListLabel.PreferredSize;
            advancementListLabel.Location = new Point(characterList.Width + 10, enforcementList.Location.Y + enforcementList.Height + 10);

            advancementList.Width = 340;
            advancementList.Height = 230;
            advancementList.Location = new Point(characterList.Width + 10, advancementListLabel.Location.Y + advancementListLabel.Height);
            advancementList.Columns.Add("Character");
            advancementList.Columns.Add("Time");
            advancementList.Columns.Add("Event");
            foreach (Log log in serverAdvancementLogs.Values)
            {
                string character = "Unknown Character";
                if(log.CharacterId > 0 && Characters.List.Keys.Contains(log.CharacterId)) character = Characters.List[log.CharacterId].Name;
                advancementList.Items.Add(new ListViewItem(new string[] { character, String.Format("{0}/{1}/{2}", log.Time.Year, log.Time.Month, log.Time.Day), log.Event, log.Id.ToString() }));
            }
            advancementList.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
            advancementList.Columns[1].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
            advancementList.Columns[2].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);

            deathListLabel.Text = "Death Alerts";
            deathListLabel.Size = deathListLabel.PreferredSize;
            deathListLabel.Location = new Point(characterList.Width + 10, advancementList.Location.Y + advancementList.Height + 10);

            deathList.Width = 340;
            deathList.Height = 230;
            deathList.Location = new Point(characterList.Width + 10, deathListLabel.Location.Y + deathListLabel.Height);
            deathList.Columns.Add("Character");
            deathList.Columns.Add("Time");
            deathList.Columns.Add("Event");
            foreach (Log log in serverDeathLogs.Values)
            {
                string character = "Unknown Character";
                try { if (log.CharacterId > 0) character = Characters.List[log.CharacterId].Name; }
                catch { }
                deathList.Items.Add(new ListViewItem(new string[] { character, String.Format("{0}/{1}/{2}", log.Time.Year, log.Time.Month, log.Time.Day), log.Event, log.Id.ToString() }));
            }
            deathList.Columns[0].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
            deathList.Columns[1].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
            deathList.Columns[2].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);

            alignmentPieLabel.Text = "Wealth Distribution";
            alignmentPieLabel.Size = alignmentPieLabel.PreferredSize;
            alignmentPieLabel.Location = new Point(enforcementList.Location.X + enforcementList.Width + 10, 0);
            alignmentPieLabel.Click += PieLabel_Click;
            
            alignmentPie.Size = new Size(350, 350);
            alignmentPie.Location = new Point(alignmentPieLabel.Location.X, alignmentPieLabel.Location.Y + alignmentPieLabel.Height);

            dmTimePieLabel.Text = "DM Coverage";
            dmTimePieLabel.Size = dmTimePieLabel.PreferredSize;
            dmTimePieLabel.Location = new Point(alignmentPie.Location.X, alignmentPie.Location.Y + alignmentPie.Height + 10);
            dmTimePieLabel.Click += PieLabel_Click;

            dmTimePie.Size = new Size(350, 350);
            dmTimePie.Location = new Point(alignmentPieLabel.Location.X, dmTimePieLabel.Location.Y + dmTimePieLabel.Height);

            legendLabel.Text = "Very Poor\n\nPoor\n\nTarget\n\nRich\n\nVery Rich\n\nCutoff Wealth";
            legendLabel.Size = legendLabel.PreferredSize;
            legendLabel.Location = new Point(alignmentPie.Location.X + alignmentPie.Width + 50, alignmentPieLabel.Location.Y + alignmentPieLabel.Height);

            legendLabelTwo.Text = "DMed\n\nUn-DMed";
            legendLabelTwo.Size = legendLabelTwo.PreferredSize;
            legendLabelTwo.Location = new Point(dmTimePie.Location.X + dmTimePie.Width + 50, dmTimePieLabel.Location.Y + dmTimePieLabel.Height);

            this.Width = dmTimePie.Width + dmTimePie.Location.X + 210;
            this.Height = dmTimePie.Height + dmTimePie.Location.Y + 30;

            this.Controls.Add(characterListLabel);
            this.Controls.Add(characterList);
            this.Controls.Add(dmListLabel);
            this.Controls.Add(dmList);
            this.Controls.Add(enforcementListLabel);
            this.Controls.Add(enforcementList);
            this.Controls.Add(advancementListLabel);
            this.Controls.Add(advancementList);
            this.Controls.Add(deathListLabel);
            this.Controls.Add(deathList);
            this.Controls.Add(alignmentPieLabel);
            this.Controls.Add(dmTimePieLabel);
            this.Controls.Add(legendLabel);
            this.Controls.Add(legendLabelTwo);
        }
        public static void IdentifyLogins()
        {
            currentLoader.status.Text = "Identifying players...";
            Application.DoEvents();
            foreach (Log thisLog in Logs.RecentLogins.Values)
            {
                try
                {
                    if (!Servers.List.Keys.Contains(thisLog.ServerId))
                    {
                        Server srv = new Server() { ServerId = thisLog.ServerId };
                        Servers.List.Add(thisLog.ServerId, srv);
                    }
                    Server currentServer = Servers.List[thisLog.ServerId];

                    if (thisLog.EventDescription.Contains("Dungeon Master:"))
                    {
                        Player dm = Players.ListByPlayerId[Characters.List[thisLog.CharacterId].PlayerId];
                        Characters.List[thisLog.CharacterId].IsDMAvatar = true;
                        if (!currentServer.RecentDMs.Contains(dm))
                        {
                            currentServer.RecentDMs.Add(dm);
                        }
                    }
                    else
                    {
                        Character character = Characters.List[thisLog.CharacterId];
                        if (!currentServer.RecentCharacters.Contains(character))
                        {
                            currentServer.RecentCharacters.Add(character);
                        }

                        Player player = Players.ListByPlayerId[Characters.List[thisLog.CharacterId].PlayerId];
                        if (!currentServer.RecentPlayers.Contains(player))
                        {
                            currentServer.RecentPlayers.Add(player);
                        }
                    }
                }
                catch { }
            }
            foreach (Server server in Servers.List.Values)
            {
                foreach (Character ch in server.RecentCharacters)
                {
                    if (ch.IsDMAvatar)
                    {
                        server.RecentCharacters.Remove(ch);
                    }
                }
            }
        }