add $si command
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
.DS_Store
|
||||
|
||||
# Build products
|
||||
src/Revision.cc
|
||||
newserv
|
||||
|
||||
# CMake files
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
@@ -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\
|
||||
|
||||
@@ -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();) {
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Executable
+19
@@ -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
|
||||
@@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
extern const char* GIT_REVISION_HASH;
|
||||
extern const uint64_t BUILD_TIMESTAMP;
|
||||
+2
-1
@@ -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),
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user