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) { @@ -44,10 +44,16 @@ void draw_messages(struct drawinfo d, std::deque<msg> &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;

1
Project1/draw.h

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

3
Project1/irc.cpp

@ -8,6 +8,8 @@ @@ -8,6 +8,8 @@
#include "irc.h"
#include <SDL.h> // 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, @@ -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);
}

31
Project1/main.cpp

@ -102,11 +102,13 @@ int main(int argc, char *argv[]) { @@ -102,11 +102,13 @@ int main(int argc, char *argv[]) {
("s,server", "irc server address (irc.chat.twitch.tv)", 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>())
("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>())
("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[]) { @@ -138,13 +140,30 @@ int main(int argc, char *argv[]) {
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 {};
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<int>();
}
if (result.count("background")) {
auto bg = CSSColorParser::parse(result["background"].as<std::string>());
if (bg) {
@ -180,6 +199,10 @@ int main(int argc, char *argv[]) { @@ -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[]) { @@ -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[]) { @@ -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:

1
Project1/types.h

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

Loading…
Cancel
Save