예제 #1
0
        private void lbl_sneeze_display_MouseMove(object sender, MouseEventArgs e)
        {
            int          sneezeIndex;
            SneezeRecord record = GetSneezeAtLocation(lbl_sneeze_display.PointToClient(MousePosition), out sneezeIndex);

            if (record == null)
            {
                toolTip.ToolTipTitle = "";
                toolTip.SetToolTip(lbl_sneeze_display, null);
                lastHoveredSneeze = null;
                return;
            }

            if (record == lastHoveredSneeze)
            {
                return;
            }
            lastHoveredSneeze = record;

            SneezeDatabase database    = SneezeClientListener.Database;
            string         toolTipText = $"Username: {database.IdToUser[record.UserId].Name}\n" +
                                         $"Date: {record.Date.ToLocalTime():g}";

            if (!String.IsNullOrEmpty(record.Comment))
            {
                toolTipText += "\n\n" + record.Comment;
            }

            toolTip.ToolTipTitle = "Sneeze " + (database.CountdownStart - sneezeIndex);
            toolTip.SetToolTip(lbl_sneeze_display, toolTipText);
        }
예제 #2
0
        private SneezeRecord GetSneezeAtLocation(Point mousePosition, out int index)
        {
            Font           font     = lbl_sneeze_display.Font;
            SneezeDatabase database = SneezeClientListener.Database;

            index = -1;
            if (database == null)
            {
                return(null);
            }

            int    viewLeftEdge        = scroll_horizontal.Value;
            int    maxSneezesPerColumn = lbl_sneeze_display.Height / font.Height;
            string maxWidthNumber      = new string('9', database.CountdownStart.ToString().Length);
            Size   numberSize;

            using (Graphics g = CreateGraphics())
                numberSize = TextRenderer.MeasureText(g, maxWidthNumber, font);
            int startingIndex = Math.Min(viewLeftEdge / (numberSize.Width + numberPadding) * maxSneezesPerColumn, database.Sneezes.Count - 1);
            int endingIndex   = Math.Min((viewLeftEdge + lbl_sneeze_display.Width + numberSize.Width) / (numberSize.Width + numberPadding) * maxSneezesPerColumn, database.Sneezes.Count - 1);

            for (int i = startingIndex; i <= endingIndex; i++)
            {
                int       columnNum = i / maxSneezesPerColumn;
                int       rowNum    = i % maxSneezesPerColumn;
                Point     textLoc   = new Point(columnNum * (numberSize.Width + numberPadding) - viewLeftEdge, rowNum * font.Height);
                Rectangle rect      = new Rectangle(textLoc, numberSize);
                if (rect.Contains(mousePosition))
                {
                    index = i;
                    return(database.Sneezes[i]);
                }
            }
            return(null);
        }
예제 #3
0
        private void DrawContributions(Graphics g, ref int y)
        {
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.SmoothingMode      = SmoothingMode.HighQuality;

            TextRenderer.DrawText(g, "Sneeze contributions", headingFont, new Point(startXMargin, y), Color.Black);
            y += headingFont.Height + headingSpacing;
            SneezeDatabase database             = SneezeClientListener.Database;
            Dictionary <Guid, UserInfo> userMap = database.IdToUser;
            float      totalAngle   = 0.0f;
            float      totalSneezes = database.Sneezes.Count - userStats[CommonInfo.UnknownUserId].TotalSneezes;
            SolidBrush background   = new SolidBrush(Color.Black);

            g.FillEllipse(background, startXMargin, y, 500, 500);
            foreach (KeyValuePair <Guid, UserStats> stats in userStats.OrderBy(u => - u.Value.TotalSneezes))
            {
                if (stats.Key == CommonInfo.UnknownUserId)
                {
                    continue;
                }

                UserInfo   user             = userMap[stats.Key];
                float      sneezePercentage = stats.Value.TotalSneezes / totalSneezes;
                float      angleForUser     = 360.0f * sneezePercentage;
                SolidBrush brush            = new SolidBrush(user.Color);
                g.FillPie(brush, startXMargin, y, 500, 500, totalAngle, angleForUser);
                totalAngle += angleForUser;
            }
        }
예제 #4
0
        private void CalculateApocalypse()
        {
            SneezeDatabase database = SneezeClientListener.Database;

            if (database == null)
            {
                lbl_apocalypse.Text = "";
                return;
            }

            DateTime startingDate;

            switch (Settings.Default.DateRange)
            {
            case DateRangeType.OneWeek: startingDate = DateTime.Now.AddDays(-7); break;

            case DateRangeType.TwoWeeks: startingDate = DateTime.Now.AddDays(-14); break;

            case DateRangeType.OneMonth: startingDate = DateTime.Now.AddMonths(-1); break;

            case DateRangeType.ThreeMonths: startingDate = DateTime.Now.AddMonths(-3); break;

            case DateRangeType.SixMonths: startingDate = DateTime.Now.AddMonths(-6); break;

            case DateRangeType.Year: startingDate = DateTime.Now.AddYears(-1); break;

            default:
            case DateRangeType.AllTime: startingDate = DateTime.MinValue; break;
            }

            int      countOfSneezesInDateRange = 0;
            DateTime dateOfFirstSneezeInRange  = DateTime.MinValue;

            for (int i = database.Sneezes.Count - 1; i >= 0; i--)
            {
                if (database.Sneezes[i].Date < startingDate)
                {
                    break;
                }
                countOfSneezesInDateRange++;
                dateOfFirstSneezeInRange = database.Sneezes[i].Date;
            }

            if (dateOfFirstSneezeInRange == DateTime.MinValue)
            {
                lbl_apocalypse.Text = "No sneezes in range";
                return;
            }

            TimeSpan timeRange = DateTime.Now - dateOfFirstSneezeInRange;
            double   millisecondsBetweenSneezes = timeRange.TotalMilliseconds / countOfSneezesInDateRange;
            double   millisecondsUntilComplete  = (database.CountdownStart - database.Sneezes.Count) * millisecondsBetweenSneezes;
            DateTime apocalypseDate             = DateTime.Now + TimeSpan.FromMilliseconds(millisecondsUntilComplete);

            lbl_apocalypse.Text = apocalypseDate.ToString("g");
        }
예제 #5
0
        private void UpdateUIState()
        {
            SneezeDatabase database    = SneezeClientListener.Database;
            bool           hasDatabase = database != null;
            bool           hasUser     = CurrentUser != null;

            cmb_sneezers.Enabled     = hasDatabase;
            btn_add_sneeze.Enabled   = hasDatabase && hasUser && database.Sneezes.Count < database.CountdownStart;
            btn_change_color.Enabled = hasDatabase && hasUser;
            txtbx_commentary.Enabled = hasDatabase && hasUser;
            btn_stats.Enabled        = hasDatabase;
            lbl_we_win.Visible       = hasDatabase && database.Sneezes.Count >= database.CountdownStart;
        }
        private static void GetDatabase()
        {
            lock (dbSync)
            {
                database = GetFromServer <SneezeDatabase>(Messages.DatabaseRequested, Messages.DatabaseObject);
                ConnectionOpened?.Invoke();
                if (!VerifyDatabase())
                {
                    return;
                }
            }

            GotDatabase?.Invoke();
        }
예제 #7
0
        public StatsForm()
        {
            InitializeComponent();

            lbl_stats_display.Size = new Size(panel1.Width, 1200);

            SneezeDatabase database = SneezeClientListener.Database;

            streakMap            = database.FindLongestStreaks();
            streakCountToUserMap = database.FindAllStreaks();
            userStats            = database.FindUserStats();
            font           = lbl_stats_display.Font;
            headingFont    = new Font(lbl_stats_display.Font.FontFamily, lbl_stats_display.Font.Size * 1.5f, FontStyle.Bold);
            subheadingFont = new Font(lbl_stats_display.Font, FontStyle.Bold);
        }
예제 #8
0
        private void btn_add_sneeze_Click(object sender, EventArgs e)
        {
            string message = GetLongestStreak(); // Calculate this first

            SneezeDatabase database   = SneezeClientListener.Database;
            int            sneezeNum  = database.CountdownStart - database.Sneezes.Count;
            DateTime       sneezeDate = CommonInfo.GetDateOfSneeze(sneezeNum);

            SneezeClientListener.Sneeze(new SneezeRecord(CurrentUser.UserGuid, sneezeDate, txtbx_commentary.Text));
            txtbx_commentary.Clear();

            if (!String.IsNullOrEmpty(message))
            {
                MessageBox.Show(message, "Sneeze Streak Status");
            }
        }
        private static bool VerifyDatabase()
        {
            if (database == null)
            {
                return(false);
            }

            if (database.Version != SneezeDatabase.currentVersionNumber)
            {
                NetworkComms.CloseAllConnections();
                database = null;
                DatabaseError?.Invoke(DatabaseErrorType.VersionNumberConflict);
                return(false);
            }

            return(true);
        }
예제 #10
0
        private void CalculateSneezeScrollBar()
        {
            SneezeDatabase database       = SneezeClientListener.Database;
            int            countdownStart = database?.CountdownStart ?? 100;
            Font           font           = lbl_sneeze_display.Font;

            if (lbl_sneeze_display.Height == 0 || lbl_sneeze_display.Width == 0)
            {
                return;
            }

            int    maxSneezesPerColumn = lbl_sneeze_display.Height / font.Height;
            string maxWidthNumber      = new string('9', countdownStart.ToString().Length);

            using (Graphics g = CreateGraphics())
            {
                Size numberSize = TextRenderer.MeasureText(g, maxWidthNumber, font);
                scroll_horizontal.Maximum = (int)Math.Ceiling((countdownStart / (float)maxSneezesPerColumn + 1) * (numberSize.Width + numberPadding) - lbl_sneeze_display.Width + numberSize.Width);
                scroll_horizontal.Minimum = 0;
            }
        }
예제 #11
0
        private void DrawRandomStats(Graphics g, ref int y)
        {
            SneezeDatabase database             = SneezeClientListener.Database;
            Dictionary <Guid, UserInfo> userMap = database.IdToUser;
            const int columnSpacing             = 110;

            y += font.Height + headingSpacing;
            TextRenderer.DrawText(g, "Random Stats", headingFont, new Point(startXMargin, y), Color.Black);
            y += headingFont.Height + headingSpacing;

            TextRenderer.DrawText(g, "User name", subheadingFont, new Point(startXMargin, y), Color.Black);
            TextRenderer.DrawText(g, "Total sneezes", subheadingFont, new Point(startXMargin + columnSpacing, y), Color.Black);
            TextRenderer.DrawText(g, "Participation days", subheadingFont, new Point(startXMargin + columnSpacing * 2, y), Color.Black);
            TextRenderer.DrawText(g, "Avg. days btwn sneezes", subheadingFont, new Point(startXMargin + columnSpacing * 3, y), Color.Black);
            y += subheadingFont.Height;
            foreach (KeyValuePair <Guid, UserStats> stats in userStats.OrderBy(u => - u.Value.TotalSneezes))
            {
                if (stats.Key == CommonInfo.UnknownUserId)
                {
                    continue;
                }

                UserInfo user = userMap[stats.Key];
                TextRenderer.DrawText(g, user.Name, font, new Point(startXMargin, y), user.Color);

                TextRenderer.DrawText(g, stats.Value.TotalSneezes.ToString(), font, new Point(startXMargin + columnSpacing, y), user.Color);
                double sneezePercentage = stats.Value.TotalSneezes * 100.0 / database.Sneezes.Count;
                TextRenderer.DrawText(g, $"({sneezePercentage:F2}%)", font, new Point(startXMargin + columnSpacing + 40, y), user.Color);

                double daysAsSneezer = (stats.Value.LastSneezeDate - stats.Value.FirstSneezeDate).TotalDays;
                TextRenderer.DrawText(g, daysAsSneezer.ToString("F0"), font, new Point(startXMargin + columnSpacing * 2, y), user.Color);

                double daysPerSneeze = daysAsSneezer / stats.Value.TotalSneezes;
                TextRenderer.DrawText(g, daysPerSneeze.ToString("F1"), font, new Point(startXMargin + columnSpacing * 3, y), user.Color);

                y += font.Height;
            }

            y += statDisplaySpacing;
        }
예제 #12
0
        private void SneezeClientListener_DatabaseUpdated()
        {
            BeginInvoke(new Action(() =>
            {
                SneezeDatabase database = SneezeClientListener.Database;
                if (database == null)
                {
                    return; // Could have been set to null after the BeginInvoke was called
                }
                lbl_sneeze_display.Invalidate();
                CalculateSneezeScrollBar();
                UpdateUIState();
                UpdateSneezers();

                cmb_sneezers.SelectedItem = database.IdToUser.Values.FirstOrDefault(u => u.UserGuid == Settings.Default.LastSneezer);
                if (database.Sneezes.Count > 0)
                {
                    Point sneezeLoc         = GetSneezeLocation(SneezeClientListener.Database.Sneezes.Count - 1);
                    scroll_horizontal.Value = Math.Max(0, sneezeLoc.X - scroll_horizontal.Width / 2);
                }

                CalculateApocalypse();
            }));
        }
 private static void HandleConnectionClosed(Connection connection)
 {
     lock (dbSync)
         database = null;
     ConnectionClosed?.Invoke();
 }
예제 #14
0
        private string GetLongestStreak()
        {
            SneezeDatabase database = SneezeClientListener.Database;

            if (database.Sneezes.Count == 0 || CurrentUser.UserGuid == CommonInfo.UnknownUserId)
            {
                return("");
            }

            Dictionary <Guid, int> streaks = database.FindLongestStreaks();
            int  longestStreak             = 0;
            Guid streakWinnerId            = database.Sneezes[0].UserId; //The first person to reach the longest streak is the winner if there is a tie

            foreach (KeyValuePair <Guid, int> streak in streaks)
            {
                if (streak.Value > longestStreak)
                {
                    longestStreak  = streak.Value;
                    streakWinnerId = streak.Key;
                }
            }

            int currentStreak = 1;
            int index         = 1;

            while (index <= database.Sneezes.Count && database.Sneezes[database.Sneezes.Count - index].UserId == CurrentUser.UserGuid)
            {
                index++;
                currentStreak++;
            }

            int    sneezesToVictory = longestStreak + 1 - currentStreak; //I definitely need to calculate the current streak rather than using 1
            string retStr           = "";


            if (currentStreak == 3 && CurrentUser.UserGuid != streakWinnerId && sneezesToVictory > 1)
            {
                retStr = String.Format("The person with the longest streak is {0} with {1} sneezes.\nYou need to sneeze {2} times in order to beat {0}.", database.IdToUser[streakWinnerId].Name, longestStreak, sneezesToVictory);
            }
            else if (sneezesToVictory == 1)
            {
                retStr = String.Format("Way to go!\nYou are only ONE sneeze away from breaking the sneeze streak record which is currently held by {0}.", database.IdToUser[streakWinnerId].Name);
            }
            else if (sneezesToVictory == 0)
            {
                if (CurrentUser.UserGuid != streakWinnerId)
                {
                    retStr = String.Format("!!! Congratulations {0} !!! \nYou set a new record for the longest sneeze streak!\nYour {1} sneeze streak beat {2}'s {3} sneeze streak.", CurrentUser.Name, currentStreak, SneezeClientListener.Database.IdToUser[streakWinnerId].Name, longestStreak);
                    if (!String.IsNullOrEmpty(txtbx_commentary.Text))
                    {
                        txtbx_commentary.Text += "\n";
                    }
                    txtbx_commentary.Text += String.Format("{0} beat {1}'s sneeze streak record.", CurrentUser.Name, database.IdToUser[streakWinnerId].Name);
                }
                else
                {
                    retStr = String.Format("!!! Congratulations {0} !!! \nYou have become a sneezing legend!\nYou have increased your lead and set a new sneeze streak record!", CurrentUser.Name);
                    if (!String.IsNullOrEmpty(txtbx_commentary.Text))
                    {
                        txtbx_commentary.Text += "\n";
                    }
                    txtbx_commentary.Text += "The legend continues!";
                }
            }
            return(retStr);
        }
예제 #15
0
        private void lbl_sneeze_display_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;

            g.Clear(Settings.Default.BoardBackColor);
            Font           font     = lbl_sneeze_display.Font;
            SneezeDatabase database = SneezeClientListener.Database;

            if (database == null)
            {
                if (failedToConnect)
                {
                    DrawTextCentered("Failed to connect to server at specified IP.", g, font, Color.Red);
                }
                else if (dbError != DatabaseErrorType.None)
                {
                    if (dbError == DatabaseErrorType.VersionNumberConflict)
                    {
                        DrawTextCentered("Database version number does not match.\nPlease update your client to the latest version.", g, font, Color.Red);
                    }
                }
                else if (connectionClosed)
                {
                    DrawTextCentered("Connection to server was lost.", g, font, Color.Red);
                }
                else if (connectionOpening)
                {
                    DrawTextCentered("Connecting...", g, font, Color.Blue);
                }
                else
                {
                    DrawTextCentered("Not connected to server.", g, font, Color.Black);
                }
                return;
            }

            if (database.Sneezes.Count == 0)
            {
                DrawTextCentered("No recorded sneezes.", g, font, Color.Black);
                return;
            }

            int    viewLeftEdge        = scroll_horizontal.Value;
            int    maxSneezesPerColumn = lbl_sneeze_display.Height / font.Height;
            string maxWidthNumber      = new string('9', database.CountdownStart.ToString().Length);
            Size   numberSize          = TextRenderer.MeasureText(g, maxWidthNumber, font);
            int    startingIndex       = Math.Min(viewLeftEdge / (numberSize.Width + numberPadding) * maxSneezesPerColumn, database.Sneezes.Count - 1);
            int    endingIndex         = Math.Min((viewLeftEdge + lbl_sneeze_display.Width + numberSize.Width) / (numberSize.Width + numberPadding) * maxSneezesPerColumn, database.Sneezes.Count - 1);

            for (int i = startingIndex; i <= endingIndex; i++)
            {
                int sneezeNum = database.CountdownStart - i;
                //DO NOT DELETE! May need this later.
                //if (sneezeNum < 26359)
                //    sneezeNum -= 5;
                //if (sneezeNum < 24423)
                //    sneezeNum += 2;
                int   columnNum = i / maxSneezesPerColumn;
                int   rowNum    = i % maxSneezesPerColumn;
                Point textLoc   = new Point(columnNum * (numberSize.Width + numberPadding) - viewLeftEdge, rowNum * font.Height);

                SneezeRecord sneeze = database.Sneezes[i];
                if (!string.IsNullOrEmpty(sneeze.Comment))
                {
                    using (Pen p = new Pen(Color.Goldenrod))
                        g.DrawRectangle(p, textLoc.X, textLoc.Y, numberSize.Width, numberSize.Height);
                }

                UserInfo userInfo;
                Color    sneezeColor = Color.Black;
                if (database.IdToUser.TryGetValue(sneeze.UserId, out userInfo))
                {
                    sneezeColor = userInfo.Color;
                }

                TextRenderer.DrawText(g, sneezeNum.ToString(), font, textLoc, sneezeColor);
            }
        }