diff --git a/server/src/client/ConnectedClientTextCommandHandler.cpp b/server/src/client/ConnectedClientTextCommandHandler.cpp index 3847f58..690ca48 100644 --- a/server/src/client/ConnectedClientTextCommandHandler.cpp +++ b/server/src/client/ConnectedClientTextCommandHandler.cpp @@ -641,12 +641,34 @@ bool ConnectedClient::handle_text_command( auto id = vc->getConnection()->getPacketIdManager().currentPacketId(type); auto gen = vc->getConnection()->getPacketIdManager().generationId(type); - auto genestis = vc->getConnection()->get_incoming_generation_estimators(); + auto& genestis = vc->getConnection()->get_incoming_generation_estimators(); send_message(_this.lock(), " OUT " + type.name() + " => generation: " + to_string(gen) + " id: " + to_string(id)); send_message(_this.lock(), " IN " + type.name() + " => generation: " + to_string(genestis[type.type()].generation()) + " id: " + to_string(genestis[type.type()].current_packet_id())); } return true; + } else if(TARG(0, "sgeneration")) { + TLEN(4); + + try { + auto type = stol(arguments[1]); + auto generation = stol(arguments[2]); + auto pid = stol(arguments[3]); + + auto vc = dynamic_pointer_cast(_this.lock()); + if(!vc) return false; + + auto& genestis = vc->getConnection()->get_incoming_generation_estimators(); + if(type >= genestis.size()) { + send_message(_this.lock(), "Invalid type"); + return true; + } + genestis[type].set_last_state(pid, generation); + } catch(std::exception& ex) { + send_message(_this.lock(), "Failed to parse argument"); + return true; + } + return true; } else if(TARG(0, "disconnect")) { auto vc = dynamic_pointer_cast(_this.lock()); if(!vc) return false; diff --git a/server/src/client/voice/VoiceClientConnection.h b/server/src/client/voice/VoiceClientConnection.h index d7560f0..b1d9fb3 100644 --- a/server/src/client/voice/VoiceClientConnection.h +++ b/server/src/client/voice/VoiceClientConnection.h @@ -82,7 +82,7 @@ namespace ts { bool wait_empty_write_and_prepare_queue(std::chrono::time_point until = std::chrono::time_point()); protocol::PacketIdManager& getPacketIdManager() { return this->packet_id_manager; } - inline auto get_incoming_generation_estimators() { return this->incoming_generation_estimators; } + inline auto& get_incoming_generation_estimators() { return this->incoming_generation_estimators; } void reset(); void force_insert_command(const pipes::buffer_view& /* payload */);