Browse Source

messages disappear automatically after 30s

master
alistair 2 years ago
parent
commit
6dd19942c5
  1. 6
      Project1/draw.cpp
  2. 1
      Project1/draw.h
  3. 3
      Project1/irc.cpp
  4. 31
      Project1/main.cpp
  5. 1
      Project1/types.h

6
Project1/draw.cpp

@ -44,10 +44,16 @@ void draw_messages(struct drawinfo d, std::deque<msg> &message_display_queue) {
int linesep = 0; int linesep = 0;
int i = message_display_queue.size() - 1; int i = message_display_queue.size() - 1;
unsigned int now = SDL_GetTicks();
int name_margin = 150; int name_margin = 150;
for (; i >= 0 && height > 20; i--) { for (; i >= 0 && height > 20; i--) {
msg m = message_display_queue.at(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); 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; height -= s.rect.h + linesep;

1
Project1/draw.h

@ -30,6 +30,7 @@ struct drawinfo {
struct fontpack fonts; struct fontpack fonts;
struct colourpack colours; struct colourpack colours;
int sock; int sock;
unsigned int max_age;
}; };

3
Project1/irc.cpp

@ -8,6 +8,8 @@
#include "irc.h" #include "irc.h"
#include <SDL.h> // for SDL_GetTicks();
enum class ircommand parse_command(const std::string& command) { enum class ircommand parse_command(const std::string& command) {
if (!command.compare("PRIVMSG")) { if (!command.compare("PRIVMSG")) {
@ -96,6 +98,7 @@ void parse_chat_messages(const std::string& messages,
std::string s; std::string s;
while (std::getline(iss, s)) { while (std::getline(iss, s)) {
auto msg = parse_chat_message(s); auto msg = parse_chat_message(s);
msg->received_at = SDL_GetTicks();
if (msg) { if (msg) {
message_queue.push_back(*msg); message_queue.push_back(*msg);
} }

31
Project1/main.cpp

@ -102,11 +102,13 @@ int main(int argc, char *argv[]) {
("s,server", "irc server address (irc.chat.twitch.tv)", cxxopts::value<std::string>()) ("s,server", "irc server address (irc.chat.twitch.tv)", cxxopts::value<std::string>())
("p,port", "irc server port (6667)", cxxopts::value<std::string>()) ("p,port", "irc server port (6667)", cxxopts::value<std::string>())
("b,background", "chat background colour (css format)", cxxopts::value<std::string>()) ("b,background", "chat background colour (css format)", cxxopts::value<std::string>())
("width", "Window width", cxxopts::value<int>())
("height", "Window height", cxxopts::value<int>())
("m,max-age", "Maximum age of a displayed message", cxxopts::value<int>())
("F,foregreound", "text colour (css format)", cxxopts::value<std::string>()) ("F,foregreound", "text colour (css format)", cxxopts::value<std::string>())
("h,help", "Print help") ("h,help", "Print help")
; ;
auto result = options.parse(argc, argv); auto result = options.parse(argc, argv);
if (result.count("help")) { if (result.count("help")) {
std::cout << options.help() << std::endl; std::cout << options.help() << std::endl;
@ -138,13 +140,30 @@ int main(int argc, char *argv[]) {
maxfps = result["fps"].as<int>(); maxfps = result["fps"].as<int>();
} }
int height = 480;
int width = 640;
if (result.count("width")) {
width = result["width"].as<int>();
}
if (result.count("height")) {
height = result["height"].as<int>();
}
drawinfo info {}; 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.fonts = load_fonts();
info.colours.background = { 230, 230, 230, 255 }; info.colours.background = { 230, 230, 230, 255 };
info.colours.messages = { 255, 255, 255, 255 }; info.colours.messages = { 255, 255, 255, 255 };
if (result.count("max-age")) {
info.max_age = result["max-age"].as<int>();
}
if (result.count("background")) { if (result.count("background")) {
auto bg = CSSColorParser::parse(result["background"].as<std::string>()); auto bg = CSSColorParser::parse(result["background"].as<std::string>());
if (bg) { if (bg) {
@ -180,6 +199,10 @@ int main(int argc, char *argv[]) {
if (delay > 0) SDL_Delay(delay); if (delay > 0) SDL_Delay(delay);
prev = now; prev = now;
if (now % 5000) {
new_message = true; // trigger an occasional full redraw
}
auto resp = readresponsenonblock(sock); auto resp = readresponsenonblock(sock);
if (resp) { if (resp) {
new_message = true; new_message = true;
@ -188,6 +211,7 @@ int main(int argc, char *argv[]) {
} }
while (SDL_PollEvent(&event)) { while (SDL_PollEvent(&event)) {
std::stringstream s{};
switch (event.type) { switch (event.type) {
case SDL_QUIT: case SDL_QUIT:
return 0; return 0;
@ -200,6 +224,9 @@ int main(int argc, char *argv[]) {
case SDL_WINDOWEVENT_SIZE_CHANGED: case SDL_WINDOWEVENT_SIZE_CHANGED:
info.drawcontext.width = event.window.data1; info.drawcontext.width = event.window.data1;
info.drawcontext.height = event.window.data2; 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 new_message = true; // trigger redraw
break; break;
default: default:

1
Project1/types.h

@ -15,4 +15,5 @@ struct msg {
std::string message; std::string message;
std::string complete_message; std::string complete_message;
enum class ircommand cmd; enum class ircommand cmd;
unsigned int received_at;
}; };

Loading…
Cancel
Save