mirror of
https://github.com/RGBCube/serenity
synced 2025-05-20 02:55:07 +00:00
IRCClient: Add the "/me" command to send CTCP ACTION emotes :^)
You can now express your feelings and actions with our IRC client by using the /me command.
This commit is contained in:
parent
3a4a9d4c6b
commit
c460f4a3cb
3 changed files with 62 additions and 9 deletions
|
@ -510,22 +510,38 @@ void IRCClient::handle_privmsg_or_notice(const Message& msg, PrivmsgOrNotice typ
|
||||||
String message_text = msg.arguments[1];
|
String message_text = msg.arguments[1];
|
||||||
auto message_color = Color::Black;
|
auto message_color = Color::Black;
|
||||||
|
|
||||||
|
bool insert_as_raw_message = false;
|
||||||
|
|
||||||
if (is_ctcp) {
|
if (is_ctcp) {
|
||||||
auto ctcp_payload = msg.arguments[1].substring_view(1, msg.arguments[1].length() - 2);
|
auto ctcp_payload = msg.arguments[1].substring_view(1, msg.arguments[1].length() - 2);
|
||||||
if (type == PrivmsgOrNotice::Privmsg)
|
if (type == PrivmsgOrNotice::Privmsg)
|
||||||
handle_ctcp_request(sender_nick, ctcp_payload);
|
handle_ctcp_request(sender_nick, ctcp_payload);
|
||||||
else
|
else
|
||||||
handle_ctcp_response(sender_nick, ctcp_payload);
|
handle_ctcp_response(sender_nick, ctcp_payload);
|
||||||
|
|
||||||
|
if (ctcp_payload.starts_with("ACTION")) {
|
||||||
|
insert_as_raw_message = true;
|
||||||
|
StringBuilder builder;
|
||||||
|
builder.append("* ");
|
||||||
|
builder.append(sender_nick);
|
||||||
|
builder.append(ctcp_payload.substring_view(6, ctcp_payload.length() - 6));
|
||||||
|
message_text = builder.to_string();
|
||||||
|
message_color = Color::Magenta;
|
||||||
|
} else {
|
||||||
StringBuilder builder;
|
StringBuilder builder;
|
||||||
builder.append("(CTCP) ");
|
builder.append("(CTCP) ");
|
||||||
builder.append(ctcp_payload);
|
builder.append(ctcp_payload);
|
||||||
message_text = builder.to_string();
|
message_text = builder.to_string();
|
||||||
message_color = Color::Blue;
|
message_color = Color::Blue;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
auto it = m_channels.find(target);
|
auto it = m_channels.find(target);
|
||||||
if (it != m_channels.end()) {
|
if (it != m_channels.end()) {
|
||||||
|
if (insert_as_raw_message)
|
||||||
|
(*it).value->add_message(message_text, message_color);
|
||||||
|
else
|
||||||
(*it).value->add_message(sender_prefix, sender_nick, message_text, message_color);
|
(*it).value->add_message(sender_prefix, sender_nick, message_text, message_color);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -539,9 +555,12 @@ void IRCClient::handle_privmsg_or_notice(const Message& msg, PrivmsgOrNotice typ
|
||||||
} else {
|
} else {
|
||||||
query = &ensure_query(sender_nick);
|
query = &ensure_query(sender_nick);
|
||||||
}
|
}
|
||||||
if (query)
|
if (query) {
|
||||||
|
if (insert_as_raw_message)
|
||||||
|
query->add_message(message_text, message_color);
|
||||||
|
else
|
||||||
query->add_message(sender_prefix, sender_nick, message_text, message_color);
|
query->add_message(sender_prefix, sender_nick, message_text, message_color);
|
||||||
else {
|
} else {
|
||||||
add_server_message(String::format("<%s> %s", sender_nick.characters(), message_text.characters()), message_color);
|
add_server_message(String::format("<%s> %s", sender_nick.characters(), message_text.characters()), message_color);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -920,6 +939,33 @@ void IRCClient::handle_user_command(const String& input)
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (command == "/ME") {
|
||||||
|
if (parts.size() < 2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto* window = current_window();
|
||||||
|
if (!window)
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto emote = input.view().substring_view_starting_after_substring(parts[0]);
|
||||||
|
StringBuilder builder;
|
||||||
|
builder.append("ACTION");
|
||||||
|
builder.append(emote);
|
||||||
|
auto action_string = builder.to_string();
|
||||||
|
String peer;
|
||||||
|
if (window->type() == IRCWindow::Type::Channel) {
|
||||||
|
peer = window->channel().name();
|
||||||
|
window->channel().add_message(String::format("* %s%s", m_nickname.characters(), String(emote).characters()), Gfx::Color::Magenta);
|
||||||
|
} else if (window->type() == IRCWindow::Type::Query) {
|
||||||
|
peer = window->query().name();
|
||||||
|
window->query().add_message(String::format("* %s%s", m_nickname.characters(), String(emote).characters()), Gfx::Color::Magenta);
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
send_ctcp_request(peer, builder.to_string());
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (command == "/TOPIC") {
|
if (command == "/TOPIC") {
|
||||||
if (parts.size() < 2)
|
if (parts.size() < 2)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -58,6 +58,12 @@ void IRCQuery::add_message(char prefix, const String& name, const String& text,
|
||||||
window().did_add_message(name, text);
|
window().did_add_message(name, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void IRCQuery::add_message(const String& text, Color color)
|
||||||
|
{
|
||||||
|
log().add_message(text, color);
|
||||||
|
window().did_add_message();
|
||||||
|
}
|
||||||
|
|
||||||
void IRCQuery::say(const String& text)
|
void IRCQuery::say(const String& text)
|
||||||
{
|
{
|
||||||
m_client.send_privmsg(m_name, text);
|
m_client.send_privmsg(m_name, text);
|
||||||
|
|
|
@ -43,6 +43,7 @@ public:
|
||||||
|
|
||||||
String name() const { return m_name; }
|
String name() const { return m_name; }
|
||||||
void add_message(char prefix, const String& name, const String& text, Color = Color::Black);
|
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;
|
void dump() const;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue