support chat shell command for non-proxy clients
This commit is contained in:
+41
-22
@@ -951,23 +951,33 @@ 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 (!is_dchat && uses_utf16(c->version())) {
|
if (c->proxy_session) {
|
||||||
send_chat_message_from_client(c->proxy_session->server_channel, args.args, 0);
|
if (!is_dchat && uses_utf16(c->version())) {
|
||||||
} else {
|
send_chat_message_from_client(c->proxy_session->server_channel, args.args, 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 {
|
} else {
|
||||||
data += args.args;
|
string data(8, '\0');
|
||||||
data.push_back('\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>{};
|
co_return deque<string>{};
|
||||||
@@ -981,18 +991,27 @@ 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");
|
||||||
}
|
}
|
||||||
string data(8, '\0');
|
if (c->proxy_session) {
|
||||||
data.push_back('\x40'); // private_flags: visible to all
|
string data(8, '\0');
|
||||||
data.push_back('\x09');
|
data.push_back('\x40'); // private_flags: visible to all
|
||||||
data.push_back('E');
|
data.push_back('\x09');
|
||||||
data += args.args;
|
data.push_back('E');
|
||||||
data.push_back('\0');
|
data += args.args;
|
||||||
data.resize((data.size() + 3) & (~3));
|
data.push_back('\0');
|
||||||
c->proxy_session->server_channel->send(0x06, 0x00, data);
|
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>{};
|
co_return deque<string>{};
|
||||||
}
|
}
|
||||||
ShellCommand c_wc("wc", "wc TEXT", fn_wchat);
|
ShellCommand c_wc("wc", "wc TEXT", fn_wchat);
|
||||||
|
|||||||
Reference in New Issue
Block a user