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
+21 -2
View File
@@ -951,9 +951,10 @@ ShellCommand c_show_slots(
}); });
asio::awaitable<deque<string>> fn_chat(ShellCommand::Args& args) { 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"); bool is_dchat = (args.command == "dchat");
if (c->proxy_session) {
if (!is_dchat && uses_utf16(c->version())) { if (!is_dchat && uses_utf16(c->version())) {
send_chat_message_from_client(c->proxy_session->server_channel, args.args, 0); send_chat_message_from_client(c->proxy_session->server_channel, args.args, 0);
} else { } else {
@@ -969,6 +970,15 @@ asio::awaitable<deque<string>> fn_chat(ShellCommand::Args& args) {
data.resize((data.size() + 3) & (~3)); data.resize((data.size() + 3) & (~3));
c->proxy_session->server_channel->send(0x06, 0x00, data); 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);
}
}
}
co_return deque<string>{}; co_return deque<string>{};
} }
@@ -981,10 +991,11 @@ ShellCommand c_dchat("dchat", "dchat DATA\n\
fn_chat); fn_chat);
asio::awaitable<deque<string>> fn_wchat(ShellCommand::Args& args) { 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())) { if (!is_ep3(c->version())) {
throw runtime_error("wchat can only be used on Episode 3"); throw runtime_error("wchat can only be used on Episode 3");
} }
if (c->proxy_session) {
string data(8, '\0'); string data(8, '\0');
data.push_back('\x40'); // private_flags: visible to all data.push_back('\x40'); // private_flags: visible to all
data.push_back('\x09'); data.push_back('\x09');
@@ -993,6 +1004,14 @@ asio::awaitable<deque<string>> fn_wchat(ShellCommand::Args& args) {
data.push_back('\0'); data.push_back('\0');
data.resize((data.size() + 3) & (~3)); data.resize((data.size() + 3) & (~3));
c->proxy_session->server_channel->send(0x06, 0x00, data); 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>{}; co_return deque<string>{};
} }
ShellCommand c_wc("wc", "wc TEXT", fn_wchat); ShellCommand c_wc("wc", "wc TEXT", fn_wchat);