add $si command

This commit is contained in:
Martin Michelsen
2023-12-23 10:23:40 -08:00
parent cf7c4674d6
commit 3823fc94f1
12 changed files with 89 additions and 8 deletions
+1
View File
@@ -2,6 +2,7 @@
.DS_Store
# Build products
src/Revision.cc
newserv
# CMake files
+8
View File
@@ -38,6 +38,12 @@ find_package(resource_file QUIET)
# Git metadata
add_custom_target(newserv-Revision-cc ALL COMMAND ./Revision-generate.sh WORKING_DIRECTORY src)
# Executable definition
set(SOURCES
@@ -100,6 +106,7 @@ set(SOURCES
src/ReceiveCommands.cc
src/ReceiveSubcommands.cc
src/ReplaySession.cc
src/Revision.cc
src/SaveFileFormats.cc
src/SendCommands.cc
src/Server.cc
@@ -122,6 +129,7 @@ endif()
add_executable(newserv ${SOURCES})
target_include_directories(newserv PUBLIC ${LIBEVENT_INCLUDE_DIR} ${Iconv_INCLUDE_DIRS})
target_link_libraries(newserv phosg ${LIBEVENT_LIBRARIES} ${Iconv_LIBRARIES} pthread)
add_dependencies(newserv newserv-Revision-cc)
if(resource_file_FOUND)
target_compile_definitions(newserv PUBLIC HAVE_RESOURCE_FILE)
+1
View File
@@ -283,6 +283,7 @@ Some commands only work on the game server and not on the proxy server. The chat
* Information commands
* `$li`: Shows basic information about the lobby or game you're in. If you're on the proxy server, shows information about your connection instead (remote Guild Card number, client ID, etc.).
* `$si`: Shows basic information about the server.
* `$ping`: Shows round-trip ping time from the server to you. On the proxy server, shows the ping time from you to the proxy and from the proxy to the server.
* `$matcount` (game server only): Shows how many of each type of material you've used.
* `$what` (game server only): Shows the type, name, and stats of the nearest item on the ground.
+16
View File
@@ -14,6 +14,7 @@
#include "Loggers.hh"
#include "ProxyServer.hh"
#include "ReceiveCommands.hh"
#include "Revision.hh"
#include "SendCommands.hh"
#include "Server.hh"
#include "StaticGameData.hh"
@@ -91,6 +92,20 @@ static void check_is_leader(shared_ptr<Lobby> l, shared_ptr<Client> c) {
////////////////////////////////////////////////////////////////////////////////
// Message commands
static void server_command_server_info(shared_ptr<Client> c, const std::string&) {
auto s = c->require_server_state();
string uptime_str = format_duration(now() - s->creation_time);
string build_date = format_time(BUILD_TIMESTAMP);
send_text_message_printf(c,
"Revision: $C6%s$C7\n$C6%s$C7\nUptime: $C6%s$C7\nLobbies: $C6%zu$C7\nClients: $C6%zu$C7(g) $C6%zu$C7(p)",
GIT_REVISION_HASH,
build_date.c_str(),
uptime_str.c_str(),
s->id_to_lobby.size(),
s->channel_to_client.size(),
s->proxy_server->num_sessions());
}
static void server_command_lobby_info(shared_ptr<Client> c, const std::string&) {
vector<string> lines;
@@ -1906,6 +1921,7 @@ static const unordered_map<string, ChatCommandDefinition> chat_commands({
{"$saverec", {server_command_saverec, nullptr}},
{"$sc", {server_command_send_client, proxy_command_send_client}},
{"$secid", {server_command_secid, proxy_command_secid}},
{"$si", {server_command_server_info, nullptr}},
{"$silence", {server_command_silence, nullptr}},
{"$song", {server_command_song, proxy_command_song}},
{"$spec", {server_command_toggle_spectator_flag, nullptr}},
+17 -1
View File
@@ -35,6 +35,7 @@
#include "Quest.hh"
#include "QuestScript.hh"
#include "ReplaySession.hh"
#include "Revision.hh"
#include "SaveFileFormats.hh"
#include "SendCommands.hh"
#include "Server.hh"
@@ -49,6 +50,7 @@ using namespace std;
bool use_terminal_colors = false;
void print_version_info();
void print_usage();
template <typename T>
@@ -204,6 +206,14 @@ Action a_help(
print_usage();
});
Action a_version(
"version", "\
version\n\
Show newserv\'s revision and build date.\n",
+[](Arguments&) -> void {
print_version_info();
});
static void a_compress_decompress_fn(Arguments& args) {
const auto& action = args.get<string>(0);
bool is_prs = ends_with(action, "-prs");
@@ -1890,8 +1900,14 @@ Action a_run_server_replay_log(
state->proxy_server.reset(); // Break reference cycle
});
void print_version_info() {
string build_date = format_time(BUILD_TIMESTAMP);
fprintf(stderr, "newserv-%s built %s UTC\n", GIT_REVISION_HASH, build_date.c_str());
}
void print_usage() {
fputs("\
print_version_info();
fputs("\n\
Usage:\n\
newserv [ACTION] [OPTIONS...]\n\
\n\
+4
View File
@@ -910,6 +910,10 @@ void ProxyServer::destroy_sessions() {
this->unlinked_sessions_to_destroy.clear();
}
size_t ProxyServer::num_sessions() const {
return this->id_to_session.size();
}
size_t ProxyServer::delete_disconnected_sessions() {
size_t count = 0;
for (auto it = this->id_to_session.begin(); it != this->id_to_session.end();) {
+2
View File
@@ -190,6 +190,8 @@ public:
void delete_session(uint64_t id);
void delete_session(struct bufferevent* bev);
size_t num_sessions() const;
size_t delete_disconnected_sessions();
private:
+12 -6
View File
@@ -2959,12 +2959,18 @@ static void on_quest_F960_result_bb(shared_ptr<Client> c, uint8_t, uint8_t, void
G_SetMesetaSlotPrizeResult_BB_6xE3 cmd_6xE3 = {{0xE3, sizeof(G_SetMesetaSlotPrizeResult_BB_6xE3) >> 2, 0x0000}, item};
send_command_t(c, 0x60, 0x00, cmd_6xE3);
p->add_item(item);
send_create_inventory_item_to_lobby(c, c->lobby_client_id, item);
if (c->log.should_log(LogLevel::INFO)) {
string name = s->item_name_index->describe_item(c->version(), item);
c->log.info("Awarded item %s", name.c_str());
try {
p->add_item(item);
send_create_inventory_item_to_lobby(c, c->lobby_client_id, item);
if (c->log.should_log(LogLevel::INFO)) {
string name = s->item_name_index->describe_item(c->version(), item);
c->log.info("Awarded item %s", name.c_str());
}
} catch (const out_of_range&) {
if (c->log.should_log(LogLevel::INFO)) {
string name = s->item_name_index->describe_item(c->version(), item);
c->log.info("Attempted to award item %s, but inventory was full", name.c_str());
}
}
}
}
+19
View File
@@ -0,0 +1,19 @@
#!/bin/sh
GIT_REVISION_HASH=$(git rev-parse --short HEAD)
TIMESTAMP_SECS=$(date +%s)
if [ -z "$GIT_REVISION_HASH" ]; then
GIT_REVISION_HASH="????"
else
if ! git diff-index --quiet HEAD -- ; then
GIT_REVISION_HASH="$GIT_REVISION_HASH+"
fi
fi
cat > Revision.cc <<EOF
#include "Revision.hh"
const char* GIT_REVISION_HASH = "$GIT_REVISION_HASH";
const uint64_t BUILD_TIMESTAMP = static_cast<uint64_t>($TIMESTAMP_SECS) * 1000000;
EOF
+6
View File
@@ -0,0 +1,6 @@
#pragma once
#include <stdint.h>
extern const char* GIT_REVISION_HASH;
extern const uint64_t BUILD_TIMESTAMP;
+2 -1
View File
@@ -30,7 +30,8 @@ ServerState::QuestF960Result::QuestF960Result(const JSON& json, std::shared_ptr<
}
ServerState::ServerState(shared_ptr<struct event_base> base, const string& config_filename, bool is_replay)
: base(base),
: creation_time(now()),
base(base),
config_filename(config_filename),
is_replay(is_replay),
dns_server_port(0),
+1
View File
@@ -59,6 +59,7 @@ struct ServerState : public std::enable_shared_from_this<ServerState> {
return (b == BehaviorSwitch::OFF_BY_DEFAULT) || (b == BehaviorSwitch::ON_BY_DEFAULT);
}
uint64_t creation_time;
std::shared_ptr<struct event_base> base;
std::string config_filename;