support chat shell command for non-proxy clients

This commit is contained in:
Martin Michelsen
2025-07-27 14:14:50 -07:00
parent 0cf59f874d
commit d430112a94
+41 -22
View File
@@ -951,23 +951,33 @@ ShellCommand c_show_slots(
});
asio::awaitable<deque<string>> fn_chat(ShellCommand::Args& args) {
auto c = args.get_proxy_client();
auto c = args.get_client();
bool is_dchat = (args.command == "dchat");
if (!is_dchat && uses_utf16(c->version())) {
send_chat_message_from_client(c->proxy_session->server_channel, args.args, 0);
} else {
string data(8, '\0');
data.push_back('\x09');
data.push_back('E');
if (is_dchat) {
data += phosg::parse_data_string(args.args, nullptr, phosg::ParseDataFlags::ALLOW_FILES);
if (c->proxy_session) {
if (!is_dchat && uses_utf16(c->version())) {
send_chat_message_from_client(c->proxy_session->server_channel, args.args, 0);
} else {
data += args.args;
data.push_back('\0');
string data(8, '\0');
data.push_back('\x09');
data.push_back('E');
if (is_dchat) {
data += phosg::parse_data_string(args.args, nullptr, phosg::ParseDataFlags::ALLOW_FILES);
} else {
data += args.args;
data.push_back('\0');
}
data.resize((data.size() + 3) & (~3));
c->proxy_session->server_channel->send(0x06, 0x00, data);
}
} else if (c->login) {
string text = is_dchat ? phosg::parse_data_string(args.args, nullptr, phosg::ParseDataFlags::ALLOW_FILES) : args.args;
auto l = c->require_lobby();
for (auto& lc : l->clients) {
if (lc) {
send_chat_message(lc, c->login->account->account_id, c->character()->disp.name.decode(c->language()), text, 0);
}
}
data.resize((data.size() + 3) & (~3));
c->proxy_session->server_channel->send(0x06, 0x00, data);
}
co_return deque<string>{};
@@ -981,18 +991,27 @@ ShellCommand c_dchat("dchat", "dchat DATA\n\
fn_chat);
asio::awaitable<deque<string>> fn_wchat(ShellCommand::Args& args) {
auto c = args.get_proxy_client();
auto c = args.get_client();
if (!is_ep3(c->version())) {
throw runtime_error("wchat can only be used on Episode 3");
}
string data(8, '\0');
data.push_back('\x40'); // private_flags: visible to all
data.push_back('\x09');
data.push_back('E');
data += args.args;
data.push_back('\0');
data.resize((data.size() + 3) & (~3));
c->proxy_session->server_channel->send(0x06, 0x00, data);
if (c->proxy_session) {
string data(8, '\0');
data.push_back('\x40'); // private_flags: visible to all
data.push_back('\x09');
data.push_back('E');
data += args.args;
data.push_back('\0');
data.resize((data.size() + 3) & (~3));
c->proxy_session->server_channel->send(0x06, 0x00, data);
} else if (c->login) {
auto l = c->require_lobby();
for (auto& lc : l->clients) {
if (lc) {
send_chat_message(lc, c->login->account->account_id, c->character()->disp.name.decode(c->language()), args.args, 0x40);
}
}
}
co_return deque<string>{};
}
ShellCommand c_wc("wc", "wc TEXT", fn_wchat);