diff options
Diffstat (limited to 'bouncer/window.cpp')
-rw-r--r-- | bouncer/window.cpp | 114 |
1 files changed, 50 insertions, 64 deletions
diff --git a/bouncer/window.cpp b/bouncer/window.cpp index 88e8247..6085304 100644 --- a/bouncer/window.cpp +++ b/bouncer/window.cpp @@ -1,4 +1,5 @@ #include "core.h" +#include "richtext.h" Window::Window(NetCore *_core) { core = _core; @@ -29,7 +30,7 @@ void Window::notifyWindowRename() { Packet::B2C_WINDOW_RENAME, packet); } -void Window::pushMessage(const char *str) { +void Window::pushMessage(const char *str, int priority) { messages.push_back(str); bool createdPacket = false; @@ -39,6 +40,7 @@ void Window::pushMessage(const char *str) { if (core->clients[i]->isAuthed()) { if (!createdPacket) { packet.writeU32(id); + packet.writeU8(priority); packet.writeStr(str); createdPacket = true; } @@ -198,18 +200,7 @@ void Channel::handleUserInput(const char *str) { if (str[0] == '/') { if (strncmp(str, "/me ", 4) == 0) { - // The duplication of code between here and - // handlePrivmsg is ugly. TODO: fixme. - char prefix[2]; - prefix[0] = getEffectivePrefixChar(server->currentNick); - prefix[1] = 0; - - snprintf(msgBuf, sizeof(msgBuf), - "* %s%s %s", - prefix, - server->currentNick, - &str[4]); - pushMessage(msgBuf); + outputUserMessage(server->currentNick, &str[4], /*isAction=*/true); snprintf(msgBuf, sizeof(msgBuf), "PRIVMSG %s :\x01" "ACTION %s\x01", @@ -218,18 +209,7 @@ void Channel::handleUserInput(const char *str) { server->sendLine(msgBuf); } } else { - // Aaaand this is also pretty ugly ><;; - // TODO: fixme. - char prefix[2]; - prefix[0] = getEffectivePrefixChar(server->currentNick); - prefix[1] = 0; - - snprintf(msgBuf, sizeof(msgBuf), - "<%s%s> %s", - prefix, - server->currentNick, - str); - pushMessage(msgBuf); + outputUserMessage(server->currentNick, str, /*isAction=*/false); snprintf(msgBuf, sizeof(msgBuf), "PRIVMSG %s :%s", @@ -573,61 +553,61 @@ void Channel::handleMode(const UserRef &user, const char *str) { } void Channel::handlePrivmsg(const UserRef &user, const char *str) { - char prefix[2]; - prefix[0] = getEffectivePrefixChar(user.nick.c_str()); - prefix[1] = 0; + outputUserMessage(user.nick.c_str(), str, /*isAction=*/false); +} - char buf[15000]; - snprintf(buf, 15000, - "<%s%s> %s", - prefix, - user.nick.c_str(), - str); +void Channel::outputUserMessage(const char *nick, const char *str, bool isAction) { + RichTextBuilder rt; - pushMessage(buf); + if (isAction) { + rt.foreground(COL_LEVEL_BASE, COL_ACTION); + rt.append("* "); + } else { + rt.writeS8('<'); + } + + char prefix = getEffectivePrefixChar(nick); + if (prefix != 0) + rt.writeS8(prefix); + + rt.append(nick); + rt.append(isAction ? " " : "> "); + + rt.appendIRC(str); + + pushMessage(rt.c_str(), 2); } void Channel::handleCtcp(const UserRef &user, const char *type, const char *params) { char buf[15000]; if (strcmp(type, "ACTION") == 0) { - char prefix[2]; - prefix[0] = getEffectivePrefixChar(user.nick.c_str()); - prefix[1] = 0; - - snprintf(buf, sizeof(buf), - "* %s%s %s", - prefix, - user.nick.c_str(), - params); - + outputUserMessage(user.nick.c_str(), params, /*isAction=*/true); } else { snprintf(buf, sizeof(buf), "CTCP from %s : %s %s", user.nick.c_str(), type, params); + pushMessage(buf, 2); } - - pushMessage(buf); } void Channel::handleTopic(const UserRef &user, const char *message) { - char buf[1024]; + RichTextBuilder rt; + rt.foreground(COL_LEVEL_BASE, COL_CHANNEL_NOTICE); if (user.isValid) { - snprintf(buf, sizeof(buf), - "%s changed the topic to: %s", - user.nick.c_str(), - message); + rt.append(user.nick.c_str()); + rt.append(" changed the topic to: "); + rt.appendIRC(message); } else { - snprintf(buf, sizeof(buf), - "Topic: %s", - message); + rt.append("Topic: "); + rt.appendIRC(message); } - pushMessage(buf); + pushMessage(rt.c_str()); topic = message; @@ -639,12 +619,18 @@ void Channel::handleTopic(const UserRef &user, const char *message) { } void Channel::handleTopicInfo(const char *user, int timestamp) { - char buf[1024]; - snprintf(buf, sizeof(buf), - "Topic set by %s at %d", - user, - timestamp); - pushMessage(buf); + char intConv[50]; + snprintf(intConv, sizeof(intConv), "%d", timestamp); + + RichTextBuilder rt; + rt.foreground(COL_LEVEL_BASE, COL_CHANNEL_NOTICE); + + rt.append("Topic set by "); + rt.append(user); + rt.append(" at "); + rt.append(intConv); + + pushMessage(rt.c_str()); } @@ -764,7 +750,7 @@ void Query::handlePrivmsg(const char *str) { partner.c_str(), str); - pushMessage(buf); + pushMessage(buf, 2); } void Query::handleCtcp(const char *type, const char *params) { @@ -784,7 +770,7 @@ void Query::handleCtcp(const char *type, const char *params) { params); } - pushMessage(buf); + pushMessage(buf, 2); } void Query::renamePartner(const char *_partner) { |