10 #include "../stdafx.h"
16 #include "../survey.h"
17 #include "../3rdparty/fmt/chrono.h"
18 #include "../3rdparty/fmt/std.h"
20 #include "../safeguards.h"
38 std::string NetworkSurveyHandler::CreatePayload(Reason reason,
bool for_preview)
40 nlohmann::json survey;
43 survey[
"reason"] = reason;
44 survey[
"date"] = fmt::format(
"{:%Y-%m-%d %H:%M:%S} (UTC)", fmt::gmtime(time(
nullptr)));
48 survey[
"key"] = for_preview ?
"(redacted)" : SURVEY_KEY;
56 auto &info = survey[
"info"];
67 auto &game = survey[
"game"];
76 int indent = for_preview ? 4 : -1;
77 return survey.dump(indent);
88 if constexpr (!NetworkSurveyHandler::IsSurveyPossible()) {
89 Debug(net, 4,
"Survey: not possible to send survey; most likely due to missing JSON library at compile-time");
94 Debug(net, 5,
"Survey: user is not participating in survey; skipping survey");
98 Debug(net, 1,
"Survey: sending survey results");
102 std::unique_lock<std::mutex>
lock(this->
mutex);
105 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now() + std::chrono::seconds(2);
107 while (!this->
transmitted && std::chrono::steady_clock::now() < end) {
109 this->
transmitted_cv.wait_for(lock, std::chrono::milliseconds(30));
116 Debug(net, 1,
"Survey: failed to send survey results");
123 if (data ==
nullptr) {
124 Debug(net, 1,
"Survey: survey results sent");
static void Connect(const std::string &uri, HTTPCallback *callback, const std::string data="")
Connect to the given URI.
Socket handler for the survey connection.
void OnFailure() override
An error has occurred and the connection has been closed.
@ PREVIEW
User is previewing the survey result.
@ EXIT
User is exiting the application.
@ LEAVE
User is leaving the game (but not exiting the application).
std::atomic< bool > transmitted
Whether the survey has been transmitted.
std::condition_variable transmitted_cv
Condition variable to inform changes to transmitted.
void OnReceiveData(std::unique_ptr< char[]> data, size_t length) override
We're receiving data.
std::mutex mutex
Mutex for the condition variable.
void Transmit(Reason reason, bool blocking=false)
Transmit the survey.
const char * NetworkSurveyUriString()
Get the URI string for the survey from the environment variable OTTD_SURVEY_URI, or when it has not b...
static const uint8_t NETWORK_SURVEY_VERSION
What version of the survey do we use?
#define Debug(category, level, format_string,...)
Ouptut a line of debugging information.
void NetworkBackgroundLoop()
We have to do some (simple) background stuff that runs normally, even when we are not in multiplayer.
Basic functions/variables used all over the place.
Network functions used by other parts of OpenTTD.
NLOHMANN_JSON_SERIALIZE_ENUM(NetworkSurveyHandler::Reason, { {NetworkSurveyHandler::Reason::PREVIEW, "preview"}, {NetworkSurveyHandler::Reason::LEAVE, "leave"}, {NetworkSurveyHandler::Reason::EXIT, "exit"}, {NetworkSurveyHandler::Reason::CRASH, "crash"}, }) std
Create the payload for the survey.
Part of the network protocol handling opt-in survey.
ClientSettings _settings_client
The current settings for this game.
Definition of the configuration tables of the settings.
NetworkSettings network
settings related to the network
ParticipateSurvey participate_survey
Participate in the automated survey.
void SurveySettings(nlohmann::json &survey, bool skip_if_default)
Convert settings to JSON.
void SurveyPlugins(nlohmann::json &survey)
Convert plugin information to JSON.
void SurveyTimers(nlohmann::json &survey)
Convert timer information to JSON.
void SurveyGameSession(nlohmann::json &survey)
Convert game session information to JSON.
void SurveyGameScript(nlohmann::json &survey)
Convert game-script information to JSON.
void SurveyConfiguration(nlohmann::json &survey)
Convert generic game information to JSON.
void SurveyOpenTTD(nlohmann::json &survey)
Convert generic OpenTTD information to JSON.
void SurveyFont(nlohmann::json &survey)
Convert font information to JSON.
void SurveyCompanies(nlohmann::json &survey)
Convert company information to JSON.
void SurveyCompiler(nlohmann::json &survey)
Convert compiler information to JSON.
void SurveyLibraries(nlohmann::json &survey)
Convert compiled libraries information to JSON.
void SurveyGrfs(nlohmann::json &survey)
Convert GRF information to JSON.
std::mutex lock
synchronization for playback status fields