mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 16:17:45 +00:00
IRCClient: Colorize some channel messages (joins, parts, topics)
This commit is contained in:
parent
794c81626e
commit
55aa819077
11 changed files with 60 additions and 23 deletions
|
@ -32,14 +32,24 @@ void IRCChannel::add_member(const String& name, char prefix)
|
|||
}
|
||||
}
|
||||
m_members.append({ name, prefix });
|
||||
dump();
|
||||
m_member_model->update();
|
||||
}
|
||||
|
||||
void IRCChannel::add_message(char prefix, const String& name, const String& text)
|
||||
void IRCChannel::remove_member(const String& name)
|
||||
{
|
||||
m_members.remove_first_matching([&] (auto& member) { return name == member.name; });
|
||||
}
|
||||
|
||||
void IRCChannel::add_message(char prefix, const String& name, const String& text, Color color)
|
||||
{
|
||||
log().add_message(prefix, name, text, color);
|
||||
window().did_add_message();
|
||||
}
|
||||
|
||||
void IRCChannel::add_message(const String& text, Color color)
|
||||
{
|
||||
log().add_message(text, color);
|
||||
window().did_add_message();
|
||||
log().add_message(prefix, name, text);
|
||||
dump();
|
||||
}
|
||||
|
||||
void IRCChannel::dump() const
|
||||
|
@ -60,19 +70,25 @@ void IRCChannel::handle_join(const String& nick, const String& hostmask)
|
|||
{
|
||||
if (nick == m_client.nickname())
|
||||
m_open = true;
|
||||
add_message(' ', "", String::format("*** %s [%s] has joined %s", nick.characters(), hostmask.characters(), m_name.characters()));
|
||||
add_message(String::format("*** %s [%s] has joined %s", nick.characters(), hostmask.characters(), m_name.characters()), Color::DarkGreen);
|
||||
}
|
||||
|
||||
void IRCChannel::handle_part(const String& nick, const String& hostmask)
|
||||
{
|
||||
if (nick == m_client.nickname())
|
||||
if (nick == m_client.nickname()) {
|
||||
m_open = false;
|
||||
add_message(' ', "", String::format("*** %s [%s] has parted from %s", nick.characters(), hostmask.characters(), m_name.characters()));
|
||||
m_members.clear();
|
||||
} else {
|
||||
remove_member(nick);
|
||||
}
|
||||
m_member_model->update();
|
||||
add_message(String::format("*** %s [%s] has parted from %s", nick.characters(), hostmask.characters(), m_name.characters()), Color::DarkGreen);
|
||||
}
|
||||
|
||||
void IRCChannel::handle_topic(const String& nick, const String& topic)
|
||||
{
|
||||
if (nick == m_client.nickname())
|
||||
m_open = false;
|
||||
add_message(' ', "", String::format("*** %s set topic to \"%s\"", nick.characters(), topic.characters()));
|
||||
if (nick.is_null())
|
||||
add_message(String::format("*** Topic is \"%s\"", topic.characters()), Color::DarkBlue);
|
||||
else
|
||||
add_message(String::format("*** %s set topic to \"%s\"", nick.characters(), topic.characters()), Color::DarkBlue);
|
||||
}
|
||||
|
|
|
@ -24,7 +24,8 @@ public:
|
|||
void add_member(const String& name, char prefix);
|
||||
void remove_member(const String& name);
|
||||
|
||||
void add_message(char prefix, const String& name, const String& text);
|
||||
void add_message(char prefix, const String& name, const String& text, Color = Color::Black);
|
||||
void add_message(const String& text, Color = Color::Black);
|
||||
|
||||
void dump() const;
|
||||
|
||||
|
|
|
@ -369,7 +369,7 @@ void IRCClient::handle_join(const Message& msg)
|
|||
|
||||
void IRCClient::handle_part(const Message& msg)
|
||||
{
|
||||
if (msg.arguments.size() != 1)
|
||||
if (msg.arguments.size() < 1)
|
||||
return;
|
||||
auto prefix_parts = msg.prefix.split('!');
|
||||
if (prefix_parts.size() < 1)
|
||||
|
@ -393,12 +393,11 @@ void IRCClient::handle_topic(const Message& msg)
|
|||
|
||||
void IRCClient::handle_rpl_topic(const Message& msg)
|
||||
{
|
||||
if (msg.arguments.size() != 3)
|
||||
if (msg.arguments.size() < 3)
|
||||
return;
|
||||
auto& nick = msg.arguments[0];
|
||||
auto& channel_name = msg.arguments[1];
|
||||
auto& topic = msg.arguments[2];
|
||||
ensure_channel(channel_name).handle_topic(nick, topic);
|
||||
ensure_channel(channel_name).handle_topic({ }, topic);
|
||||
// FIXME: Handle RPL_TOPICWHOTIME so we can know who set it and when.
|
||||
}
|
||||
|
||||
|
@ -501,7 +500,7 @@ void IRCClient::handle_rpl_topicwhotime(const Message& msg)
|
|||
tm->tm_sec
|
||||
);
|
||||
}
|
||||
ensure_channel(channel_name).add_message(0, "", String::format("Topic set by %s at %s", nick.characters(), setat.characters()));
|
||||
ensure_channel(channel_name).add_message(String::format("*** (set by %s at %s)", nick.characters(), setat.characters()), Color::DarkBlue);
|
||||
}
|
||||
|
||||
void IRCClient::register_subwindow(IRCWindow& subwindow)
|
||||
|
|
|
@ -17,9 +17,15 @@ IRCLogBuffer::~IRCLogBuffer()
|
|||
{
|
||||
}
|
||||
|
||||
void IRCLogBuffer::add_message(char prefix, const String& name, const String& text)
|
||||
void IRCLogBuffer::add_message(char prefix, const String& name, const String& text, Color color)
|
||||
{
|
||||
m_messages.enqueue({ time(nullptr), prefix, name, text });
|
||||
m_messages.enqueue({ time(nullptr), prefix, name, text, color });
|
||||
m_model->update();
|
||||
}
|
||||
|
||||
void IRCLogBuffer::add_message(const String& text, Color color)
|
||||
{
|
||||
m_messages.enqueue({ time(nullptr), '\0', String(), text, color });
|
||||
m_model->update();
|
||||
}
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <AK/CircularQueue.h>
|
||||
#include <AK/Retainable.h>
|
||||
#include <AK/RetainPtr.h>
|
||||
#include <SharedGraphics/Color.h>
|
||||
|
||||
class IRCLogBufferModel;
|
||||
|
||||
|
@ -17,11 +18,13 @@ public:
|
|||
char prefix { 0 };
|
||||
String sender;
|
||||
String text;
|
||||
Color color { Color::Black };
|
||||
};
|
||||
|
||||
int count() const { return m_messages.size(); }
|
||||
const Message& at(int index) const { return m_messages.at(index); }
|
||||
void add_message(char prefix, const String& name, const String& text);
|
||||
void add_message(char prefix, const String& name, const String& text, Color = Color::Black);
|
||||
void add_message(const String& text, Color = Color::Black);
|
||||
void dump() const;
|
||||
|
||||
const IRCLogBufferModel* model() const { return m_model; }
|
||||
|
|
|
@ -59,6 +59,10 @@ GVariant IRCLogBufferModel::data(const GModelIndex& index, Role role) const
|
|||
case Column::Text: return entry.text;
|
||||
}
|
||||
}
|
||||
if (role == Role::ForegroundColor) {
|
||||
if (index.column() == Column::Text)
|
||||
return m_log_buffer->at(index.row()).color;
|
||||
}
|
||||
return { };
|
||||
}
|
||||
|
||||
|
|
|
@ -27,11 +27,10 @@ void IRCQuery::dump() const
|
|||
log().dump();
|
||||
}
|
||||
|
||||
void IRCQuery::add_message(char prefix, const String& name, const String& text)
|
||||
void IRCQuery::add_message(char prefix, const String& name, const String& text, Color color)
|
||||
{
|
||||
log().add_message(prefix, name, text, color);
|
||||
window().did_add_message();
|
||||
log().add_message(prefix, name, text);
|
||||
dump();
|
||||
}
|
||||
|
||||
void IRCQuery::say(const String& text)
|
||||
|
|
|
@ -16,7 +16,7 @@ public:
|
|||
~IRCQuery();
|
||||
|
||||
String name() const { return m_name; }
|
||||
void add_message(char prefix, const String& name, const String& text);
|
||||
void add_message(char prefix, const String& name, const String& text, Color = Color::Black);
|
||||
|
||||
void dump() const;
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include "IRCWindowListModel.h"
|
||||
#include "IRCWindow.h"
|
||||
#include "IRCClient.h"
|
||||
#include "IRCChannel.h"
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
|
||||
|
@ -58,6 +59,8 @@ GVariant IRCWindowListModel::data(const GModelIndex& index, Role role) const
|
|||
auto& window = m_client.window_at(index.row());
|
||||
if (window.unread_count())
|
||||
return Color(Color::Red);
|
||||
if (!window.channel().is_open())
|
||||
return Color(Color::LightGray);
|
||||
return Color(Color::Black);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,6 +20,9 @@ Color::Color(NamedColor named)
|
|||
case DarkGray: rgb = { 64, 64, 64 }; break;
|
||||
case MidGray: rgb = { 127, 127, 127 }; break;
|
||||
case LightGray: rgb = { 192, 192, 192 }; break;
|
||||
case DarkGreen: rgb = { 0, 128, 0 }; break;
|
||||
case DarkBlue: rgb = { 0, 0, 128 }; break;
|
||||
case DarkRed: rgb = { 128, 0, 0 }; break;
|
||||
default: ASSERT_NOT_REACHED(); break;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,6 +23,9 @@ public:
|
|||
DarkGray,
|
||||
MidGray,
|
||||
LightGray,
|
||||
DarkGreen,
|
||||
DarkBlue,
|
||||
DarkRed,
|
||||
};
|
||||
|
||||
Color() { }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue