From 6dd19942c53fc0eefbfaaa0f6eaeb64f9882328a Mon Sep 17 00:00:00 2001 From: alistair Date: Sun, 27 Feb 2022 23:34:35 +1000 Subject: [PATCH] messages disappear automatically after 30s --- Project1/draw.cpp | 6 ++++++ Project1/draw.h | 1 + Project1/irc.cpp | 3 +++ Project1/main.cpp | 31 +++++++++++++++++++++++++++++-- Project1/types.h | 1 + 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/Project1/draw.cpp b/Project1/draw.cpp index 0a1460e..dd441a5 100644 --- a/Project1/draw.cpp +++ b/Project1/draw.cpp @@ -44,10 +44,16 @@ void draw_messages(struct drawinfo d, std::deque &message_display_queue) { int linesep = 0; int i = message_display_queue.size() - 1; + unsigned int now = SDL_GetTicks(); + int name_margin = 150; for (; i >= 0 && height > 20; i--) { msg m = message_display_queue.at(i); + if (now - m.received_at > d.max_age) { + continue; + } + struct chat_line_shape s = draw_text(d.drawcontext, d.fonts.messages, d.colours.messages, d.drawcontext.width - 20 - name_margin, m.message); height -= s.rect.h + linesep; diff --git a/Project1/draw.h b/Project1/draw.h index f48c179..2cadc70 100644 --- a/Project1/draw.h +++ b/Project1/draw.h @@ -30,6 +30,7 @@ struct drawinfo { struct fontpack fonts; struct colourpack colours; int sock; + unsigned int max_age; }; diff --git a/Project1/irc.cpp b/Project1/irc.cpp index 037bc38..f9908d0 100644 --- a/Project1/irc.cpp +++ b/Project1/irc.cpp @@ -8,6 +8,8 @@ #include "irc.h" +#include // for SDL_GetTicks(); + enum class ircommand parse_command(const std::string& command) { if (!command.compare("PRIVMSG")) { @@ -96,6 +98,7 @@ void parse_chat_messages(const std::string& messages, std::string s; while (std::getline(iss, s)) { auto msg = parse_chat_message(s); + msg->received_at = SDL_GetTicks(); if (msg) { message_queue.push_back(*msg); } diff --git a/Project1/main.cpp b/Project1/main.cpp index fd210dd..1fd2f11 100644 --- a/Project1/main.cpp +++ b/Project1/main.cpp @@ -102,11 +102,13 @@ int main(int argc, char *argv[]) { ("s,server", "irc server address (irc.chat.twitch.tv)", cxxopts::value()) ("p,port", "irc server port (6667)", cxxopts::value()) ("b,background", "chat background colour (css format)", cxxopts::value()) + ("width", "Window width", cxxopts::value()) + ("height", "Window height", cxxopts::value()) + ("m,max-age", "Maximum age of a displayed message", cxxopts::value()) ("F,foregreound", "text colour (css format)", cxxopts::value()) ("h,help", "Print help") ; - auto result = options.parse(argc, argv); if (result.count("help")) { std::cout << options.help() << std::endl; @@ -138,13 +140,30 @@ int main(int argc, char *argv[]) { maxfps = result["fps"].as(); } + int height = 480; + int width = 640; + + if (result.count("width")) { + width = result["width"].as(); + } + if (result.count("height")) { + height = result["height"].as(); + } drawinfo info {}; - info.drawcontext = create_window(640, 480, "Twitch chat " + channel); + std::string window_title = "Twitch chat " + channel; + std::stringstream s {}; + s << window_title + " " << width << "x" << height; + info.max_age = 30000; // messages disappear after 30 seconds + info.drawcontext = create_window(width, height, s.str()); info.fonts = load_fonts(); info.colours.background = { 230, 230, 230, 255 }; info.colours.messages = { 255, 255, 255, 255 }; + if (result.count("max-age")) { + info.max_age = result["max-age"].as(); + } + if (result.count("background")) { auto bg = CSSColorParser::parse(result["background"].as()); if (bg) { @@ -180,6 +199,10 @@ int main(int argc, char *argv[]) { if (delay > 0) SDL_Delay(delay); prev = now; + if (now % 5000) { + new_message = true; // trigger an occasional full redraw + } + auto resp = readresponsenonblock(sock); if (resp) { new_message = true; @@ -188,6 +211,7 @@ int main(int argc, char *argv[]) { } while (SDL_PollEvent(&event)) { + std::stringstream s{}; switch (event.type) { case SDL_QUIT: return 0; @@ -200,6 +224,9 @@ int main(int argc, char *argv[]) { case SDL_WINDOWEVENT_SIZE_CHANGED: info.drawcontext.width = event.window.data1; info.drawcontext.height = event.window.data2; + s << window_title; + s << " " << info.drawcontext.width << "x" << info.drawcontext.height; + SDL_SetWindowTitle(info.drawcontext.win, s.str().c_str()); new_message = true; // trigger redraw break; default: diff --git a/Project1/types.h b/Project1/types.h index 023e835..33376bd 100644 --- a/Project1/types.h +++ b/Project1/types.h @@ -15,4 +15,5 @@ struct msg { std::string message; std::string complete_message; enum class ircommand cmd; + unsigned int received_at; };