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