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 .DS_Store
# Build products # Build products
src/Revision.cc
newserv newserv
# CMake files # 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 # Executable definition
set(SOURCES set(SOURCES
@@ -100,6 +106,7 @@ set(SOURCES
src/ReceiveCommands.cc src/ReceiveCommands.cc
src/ReceiveSubcommands.cc src/ReceiveSubcommands.cc
src/ReplaySession.cc src/ReplaySession.cc
src/Revision.cc
src/SaveFileFormats.cc src/SaveFileFormats.cc
src/SendCommands.cc src/SendCommands.cc
src/Server.cc src/Server.cc
@@ -122,6 +129,7 @@ endif()
add_executable(newserv ${SOURCES}) add_executable(newserv ${SOURCES})
target_include_directories(newserv PUBLIC ${LIBEVENT_INCLUDE_DIR} ${Iconv_INCLUDE_DIRS}) target_include_directories(newserv PUBLIC ${LIBEVENT_INCLUDE_DIR} ${Iconv_INCLUDE_DIRS})
target_link_libraries(newserv phosg ${LIBEVENT_LIBRARIES} ${Iconv_LIBRARIES} pthread) target_link_libraries(newserv phosg ${LIBEVENT_LIBRARIES} ${Iconv_LIBRARIES} pthread)
add_dependencies(newserv newserv-Revision-cc)
if(resource_file_FOUND) if(resource_file_FOUND)
target_compile_definitions(newserv PUBLIC HAVE_RESOURCE_FILE) 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 * 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.). * `$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. * `$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. * `$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. * `$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 "Loggers.hh"
#include "ProxyServer.hh" #include "ProxyServer.hh"
#include "ReceiveCommands.hh" #include "ReceiveCommands.hh"
#include "Revision.hh"
#include "SendCommands.hh" #include "SendCommands.hh"
#include "Server.hh" #include "Server.hh"
#include "StaticGameData.hh" #include "StaticGameData.hh"
@@ -91,6 +92,20 @@ static void check_is_leader(shared_ptr<Lobby> l, shared_ptr<Client> c) {
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Message commands // 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&) { static void server_command_lobby_info(shared_ptr<Client> c, const std::string&) {
vector<string> lines; vector<string> lines;
@@ -1906,6 +1921,7 @@ static const unordered_map<string, ChatCommandDefinition> chat_commands({
{"$saverec", {server_command_saverec, nullptr}}, {"$saverec", {server_command_saverec, nullptr}},
{"$sc", {server_command_send_client, proxy_command_send_client}}, {"$sc", {server_command_send_client, proxy_command_send_client}},
{"$secid", {server_command_secid, proxy_command_secid}}, {"$secid", {server_command_secid, proxy_command_secid}},
{"$si", {server_command_server_info, nullptr}},
{"$silence", {server_command_silence, nullptr}}, {"$silence", {server_command_silence, nullptr}},
{"$song", {server_command_song, proxy_command_song}}, {"$song", {server_command_song, proxy_command_song}},
{"$spec", {server_command_toggle_spectator_flag, nullptr}}, {"$spec", {server_command_toggle_spectator_flag, nullptr}},
+17 -1
View File
@@ -35,6 +35,7 @@
#include "Quest.hh" #include "Quest.hh"
#include "QuestScript.hh" #include "QuestScript.hh"
#include "ReplaySession.hh" #include "ReplaySession.hh"
#include "Revision.hh"
#include "SaveFileFormats.hh" #include "SaveFileFormats.hh"
#include "SendCommands.hh" #include "SendCommands.hh"
#include "Server.hh" #include "Server.hh"
@@ -49,6 +50,7 @@ using namespace std;
bool use_terminal_colors = false; bool use_terminal_colors = false;
void print_version_info();
void print_usage(); void print_usage();
template <typename T> template <typename T>
@@ -204,6 +206,14 @@ Action a_help(
print_usage(); 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) { static void a_compress_decompress_fn(Arguments& args) {
const auto& action = args.get<string>(0); const auto& action = args.get<string>(0);
bool is_prs = ends_with(action, "-prs"); bool is_prs = ends_with(action, "-prs");
@@ -1890,8 +1900,14 @@ Action a_run_server_replay_log(
state->proxy_server.reset(); // Break reference cycle 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() { void print_usage() {
fputs("\ print_version_info();
fputs("\n\
Usage:\n\ Usage:\n\
newserv [ACTION] [OPTIONS...]\n\ newserv [ACTION] [OPTIONS...]\n\
\n\ \n\
+4
View File
@@ -910,6 +910,10 @@ void ProxyServer::destroy_sessions() {
this->unlinked_sessions_to_destroy.clear(); 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 ProxyServer::delete_disconnected_sessions() {
size_t count = 0; size_t count = 0;
for (auto it = this->id_to_session.begin(); it != this->id_to_session.end();) { 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(uint64_t id);
void delete_session(struct bufferevent* bev); void delete_session(struct bufferevent* bev);
size_t num_sessions() const;
size_t delete_disconnected_sessions(); size_t delete_disconnected_sessions();
private: private:
+7 -1
View File
@@ -2959,13 +2959,19 @@ 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}; G_SetMesetaSlotPrizeResult_BB_6xE3 cmd_6xE3 = {{0xE3, sizeof(G_SetMesetaSlotPrizeResult_BB_6xE3) >> 2, 0x0000}, item};
send_command_t(c, 0x60, 0x00, cmd_6xE3); send_command_t(c, 0x60, 0x00, cmd_6xE3);
try {
p->add_item(item); p->add_item(item);
send_create_inventory_item_to_lobby(c, c->lobby_client_id, item); send_create_inventory_item_to_lobby(c, c->lobby_client_id, item);
if (c->log.should_log(LogLevel::INFO)) { if (c->log.should_log(LogLevel::INFO)) {
string name = s->item_name_index->describe_item(c->version(), item); string name = s->item_name_index->describe_item(c->version(), item);
c->log.info("Awarded item %s", name.c_str()); 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) 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), config_filename(config_filename),
is_replay(is_replay), is_replay(is_replay),
dns_server_port(0), 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); return (b == BehaviorSwitch::OFF_BY_DEFAULT) || (b == BehaviorSwitch::ON_BY_DEFAULT);
} }
uint64_t creation_time;
std::shared_ptr<struct event_base> base; std::shared_ptr<struct event_base> base;
std::string config_filename; std::string config_filename;