scores.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #include "scores.h"
  2. #include "utils.h"
  3. #include <algorithm> // max
  4. #include <iomanip> // setw
  5. #include <sstream> // ostringstream
  6. door::renderFunction scoresRender(door::ANSIColor date, int dlen,
  7. door::ANSIColor nick, int nlen,
  8. door::ANSIColor score)
  9. {
  10. door::renderFunction rf = [date, dlen, nick, nlen,
  11. score](const std::string &txt) -> door::Render
  12. {
  13. door::Render r(txt);
  14. r.append(date, dlen);
  15. r.append(nick, nlen);
  16. int left = txt.size() - (dlen + nlen);
  17. r.append(score, left);
  18. return r;
  19. };
  20. return rf;
  21. }
  22. std::unique_ptr<door::Panel> Scores::make_top_scores_panel()
  23. {
  24. const int W = 38;
  25. door::COLOR panel_bg = door::COLOR::BLUE;
  26. door::ANSIColor panel_color =
  27. door::ANSIColor(door::COLOR::CYAN, panel_bg); //, door::ATTR::BOLD);
  28. door::ANSIColor heading_color = panel_color;
  29. heading_color.setFg(door::COLOR::GREEN, door::ATTR::BOLD);
  30. std::unique_ptr<door::Panel> p = std::make_unique<door::Panel>(W);
  31. p->setStyle(door::BorderStyle::DOUBLE);
  32. p->setColor(panel_color);
  33. std::unique_ptr<door::Line> heading =
  34. std::make_unique<door::Line>("The TOP Monthly Scores:", W, heading_color);
  35. // heading->setColor(heading_color);
  36. p->addLine(std::move(heading));
  37. std::unique_ptr<door::Line> spacer = p->spacer_line(false);
  38. p->addLine(std::move(spacer));
  39. auto monthly_scores = db.getMonthlyScores(15);
  40. if (monthly_scores.empty())
  41. {
  42. // No Monthly Scores
  43. door::ANSIColor nny_color =
  44. door::ANSIColor(door::COLOR::YELLOW, panel_bg, door::ATTR::BOLD);
  45. std::unique_ptr<door::Line> heading =
  46. std::make_unique<door::Line>("No, Not Yet!", W, nny_color);
  47. // heading->setColor(heading_color);
  48. p->addLine(std::move(heading));
  49. }
  50. ostringstream oss;
  51. // get length of longest month
  52. time_t longest = 1631280600; // 9/10/2021 9:30:10
  53. std::string longest_date = convertDateToMonthlyFormat(longest);
  54. int longest_month = longest_date.size();
  55. #ifdef DEBUG_OUTPUT
  56. if (get_logger)
  57. get_logger() << "longest_date: " << longest_date << " " << longest_month
  58. << std::endl;
  59. #endif
  60. door::ANSIColor nick = panel_color;
  61. nick.setFg(door::COLOR::CYAN);
  62. door::ANSIColor yourNick = panel_color;
  63. yourNick.setFg(door::COLOR::GREEN, door::ATTR::BOLD);
  64. door::ANSIColor date = panel_color;
  65. date.setFg(door::COLOR::WHITE, door::ATTR::BOLD);
  66. door::ANSIColor score = panel_color;
  67. score.setFg(door::COLOR::CYAN, door::ATTR::BOLD);
  68. door::ANSIColor yourScore = panel_color;
  69. yourScore.setFg(door::COLOR::YELLOW, door::ATTR::BOLD);
  70. door::renderFunction scoreColors =
  71. scoresRender(date, longest_month, nick, 17, score);
  72. door::renderFunction yourScoreColors =
  73. scoresRender(date, longest_month, yourNick, 17, yourScore);
  74. for (auto it : monthly_scores)
  75. {
  76. time_t date = it.date;
  77. std::string nice_date = convertDateToMonthlyFormat(date);
  78. oss.clear();
  79. oss.str(std::string());
  80. oss << std::setw(longest_month) << nice_date << " " << std::setw(16)
  81. << it.user << " " << it.score;
  82. std::unique_ptr<door::Line> line =
  83. std::make_unique<door::Line>(oss.str(), W);
  84. if ((it.user == door.username) or (it.user == door.handle))
  85. line->setRender(yourScoreColors);
  86. else
  87. line->setRender(scoreColors);
  88. p->addLine(std::move(line));
  89. }
  90. return p;
  91. }
  92. std::unique_ptr<door::Panel> Scores::make_top_this_month_panel()
  93. {
  94. const int W = 34;
  95. door::COLOR panel_bg = door::COLOR::BLUE;
  96. door::ANSIColor panel_color = door::ANSIColor(door::COLOR::CYAN, panel_bg);
  97. door::ANSIColor heading_color =
  98. door::ANSIColor(door::COLOR::GREEN, panel_bg, door::ATTR::BOLD);
  99. std::unique_ptr<door::Panel> p = std::make_unique<door::Panel>(W);
  100. p->setStyle(door::BorderStyle::DOUBLE);
  101. p->setColor(panel_color);
  102. std::string text = "The TOP Scores for ";
  103. {
  104. auto now = std::chrono::system_clock::now();
  105. time_t date = std::chrono::system_clock::to_time_t(now);
  106. text += convertDateToMonthlyFormat(date);
  107. text += ":";
  108. }
  109. std::unique_ptr<door::Line> heading =
  110. std::make_unique<door::Line>(text, W, heading_color);
  111. // heading->setColor(heading_color);
  112. p->addLine(std::move(heading));
  113. std::unique_ptr<door::Line> spacer = p->spacer_line(false);
  114. p->addLine(std::move(spacer));
  115. auto monthly_scores = db.getScores(15);
  116. if (monthly_scores.empty())
  117. {
  118. // No Monthly Scores
  119. door::ANSIColor nny_color =
  120. door::ANSIColor(door::COLOR::YELLOW, panel_bg, door::ATTR::BOLD);
  121. std::unique_ptr<door::Line> heading =
  122. std::make_unique<door::Line>("No, Not Yet!", W, nny_color);
  123. // heading->setColor(heading_color);
  124. p->addLine(std::move(heading));
  125. }
  126. ostringstream oss;
  127. time_t longest = 1631280600; // 9/10/2021 9:30:10
  128. std::string longest_date = convertDateToMonthDayFormat(longest);
  129. int longest_month = longest_date.size();
  130. #ifdef DEBUG_OUTPUT
  131. if (get_logger)
  132. get_logger() << __FILE__ << "@" << __LINE__
  133. << " longest_date: " << longest_date << " " << longest_month
  134. << std::endl;
  135. #endif
  136. door::ANSIColor nick = panel_color;
  137. nick.setFg(door::COLOR::CYAN);
  138. door::ANSIColor yourNick = panel_color;
  139. yourNick.setFg(door::COLOR::GREEN, door::ATTR::BOLD);
  140. door::ANSIColor date = panel_color;
  141. date.setFg(door::COLOR::WHITE, door::ATTR::BOLD);
  142. door::ANSIColor score = panel_color;
  143. score.setFg(door::COLOR::CYAN, door::ATTR::BOLD);
  144. door::ANSIColor yourScore = panel_color;
  145. yourScore.setFg(door::COLOR::YELLOW, door::ATTR::BOLD);
  146. door::renderFunction scoreColors =
  147. scoresRender(date, longest_month, nick, 17, score);
  148. door::renderFunction yourScoreColors =
  149. scoresRender(date, longest_month, yourNick, 17, yourScore);
  150. for (auto it : monthly_scores)
  151. {
  152. time_t date = it.date;
  153. std::string nice_date = convertDateToMonthDayFormat(date);
  154. oss.clear();
  155. oss.str(std::string());
  156. oss << std::setw(longest_month) << nice_date << " " << std::setw(16)
  157. << it.user << " " << it.score;
  158. std::unique_ptr<door::Line> line =
  159. std::make_unique<door::Line>(oss.str(), W);
  160. if ((it.user == door.username) or (it.user == door.handle))
  161. line->setRender(yourScoreColors);
  162. else
  163. line->setRender(scoreColors);
  164. p->addLine(std::move(line));
  165. }
  166. return p;
  167. }
  168. Scores::Scores(door::Door &d, DBData &dbd, Starfield &sf)
  169. : door{d}, db{dbd}, stars{sf}
  170. {
  171. top_scores = make_top_scores_panel();
  172. top_this_month = make_top_this_month_panel();
  173. }
  174. void Scores::display_scores(door::Door &door)
  175. {
  176. if (cls_display_starfield)
  177. cls_display_starfield();
  178. int mx = door.width;
  179. int my = door.height;
  180. int h = std::max(top_scores->getHeight(), top_this_month->getHeight());
  181. int padx = (mx - (top_scores->getWidth() + top_this_month->getWidth())) / 3;
  182. int pady = (my - h) / 2;
  183. top_scores->set(padx, pady);
  184. // display top_this_month, then top_scores.
  185. // This gives the press a key prompt a good place to be.
  186. top_this_month->set(padx * 2 + top_scores->getWidth(), pady);
  187. door << *top_this_month << *top_scores << door::reset << door::nl;
  188. }