re-add motd & featured content
This commit is contained in:
parent
f8eb92fff4
commit
a51fa416cf
@ -88,7 +88,7 @@ namespace download
|
|||||||
}, scheduler::pipeline::lui);
|
}, scheduler::pipeline::lui);
|
||||||
}
|
}
|
||||||
|
|
||||||
console::debug("Download progress: %lli/%lli\n", progress, total);
|
//console::debug("Download progress: %lli/%lli\n", progress, total);
|
||||||
if (download_aborted())
|
if (download_aborted())
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1,35 +1,123 @@
|
|||||||
#include <std_include.hpp>
|
#include <std_include.hpp>
|
||||||
#include "loader/component_loader.hpp"
|
#include "loader/component_loader.hpp"
|
||||||
|
|
||||||
|
#include "console.hpp"
|
||||||
#include "materials.hpp"
|
#include "materials.hpp"
|
||||||
|
#include "motd.hpp"
|
||||||
|
#include "scheduler.hpp"
|
||||||
|
|
||||||
#include "game/game.hpp"
|
#include "game/game.hpp"
|
||||||
|
|
||||||
#include <utils/http.hpp>
|
#include <utils/string.hpp>
|
||||||
|
|
||||||
|
#define WEBSITE_DATA_URL "https://raw.githubusercontent.com/h1-mod/website/publish/data"
|
||||||
|
|
||||||
namespace motd
|
namespace motd
|
||||||
{
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
bool waiting = true;
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
featured_content_t featured_content;
|
||||||
|
|
||||||
|
//std::optional<utils::http::result> motd_image_data;
|
||||||
|
|
||||||
|
void get_featured_content(const std::string& content_name, const int content_index)
|
||||||
|
{
|
||||||
|
const auto name = utils::string::va(content_name.data(), content_index);
|
||||||
|
const auto url = utils::string::va(WEBSITE_DATA_URL "/%s", name);
|
||||||
|
const auto result = utils::http::get_data(url, {}, {}, {});
|
||||||
|
if (result.has_value())
|
||||||
|
{
|
||||||
|
featured_content.insert_or_assign(name, result.value());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
bool handle_featured_content()
|
||||||
|
{
|
||||||
|
if (index > 3)
|
||||||
|
{
|
||||||
|
return scheduler::cond_end;
|
||||||
|
}
|
||||||
|
|
||||||
|
scheduler::once([&]()
|
||||||
|
{
|
||||||
|
if (index > 3)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto name = (index == 0 ? "motd.json" : "featured%d.json");
|
||||||
|
get_featured_content(name, index);
|
||||||
|
|
||||||
|
++index;
|
||||||
|
}, scheduler::async);
|
||||||
|
|
||||||
|
return scheduler::cond_continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
void download_motd_image()
|
||||||
|
{
|
||||||
|
motd_image_data = utils::http::get_data(WEBSITE_DATA_URL "/motd.png", {}, {}, {});
|
||||||
|
waiting = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool setup_motd_image()
|
||||||
|
{
|
||||||
|
if (waiting)
|
||||||
|
{
|
||||||
|
return scheduler::cond_continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!motd_image_data.has_value())
|
||||||
|
{
|
||||||
|
printf("motd image doesn't have a value\n");
|
||||||
|
return scheduler::cond_end;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("motd image loading...");
|
||||||
|
|
||||||
|
const auto material = materials::create_material("motd_image");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!materials::setup_material_image(material, motd_image_data.value().buffer))
|
||||||
|
{
|
||||||
|
materials::free_material(material);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("motd image loaded");
|
||||||
|
}
|
||||||
|
catch (const std::exception& e)
|
||||||
|
{
|
||||||
|
materials::free_material(material);
|
||||||
|
console::error("Failed to load MOTD image: %s\n", e.what());
|
||||||
|
}
|
||||||
|
|
||||||
|
return scheduler::cond_end;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
featured_content_t& get_featured_content()
|
||||||
|
{
|
||||||
|
return featured_content;
|
||||||
|
}
|
||||||
|
|
||||||
class component final : public component_interface
|
class component final : public component_interface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void post_load() override
|
void post_load() override
|
||||||
{
|
{
|
||||||
std::thread([]
|
if (!game::environment::is_mp())
|
||||||
{
|
|
||||||
//auto data = utils::http::get_data("https://h1.gg/data/motd.png");
|
|
||||||
//if (data.has_value())
|
|
||||||
//{
|
|
||||||
// materials::add("motd_image", data.value().buffer);
|
|
||||||
//}
|
|
||||||
}).detach();
|
|
||||||
}
|
|
||||||
|
|
||||||
void post_unpack() override
|
|
||||||
{
|
|
||||||
if (game::environment::is_sp())
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//scheduler::once(download_motd_image, scheduler::async);
|
||||||
|
//scheduler::schedule(setup_motd_image, scheduler::main);
|
||||||
|
scheduler::schedule(handle_featured_content, scheduler::async);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
10
src/client/component/motd.hpp
Normal file
10
src/client/component/motd.hpp
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <utils/http.hpp>
|
||||||
|
|
||||||
|
namespace motd
|
||||||
|
{
|
||||||
|
using featured_content_t = std::unordered_map<std::string, utils::http::result>;
|
||||||
|
|
||||||
|
featured_content_t& get_featured_content();
|
||||||
|
}
|
@ -249,7 +249,7 @@ namespace party
|
|||||||
|
|
||||||
if (mapname.contains('.') || mapname.contains("::"))
|
if (mapname.contains('.') || mapname.contains("::"))
|
||||||
{
|
{
|
||||||
throw std::runtime_error(utils::string::va("Invalid server mapname value %s\n", mapname.data()));
|
throw std::runtime_error(utils::string::va("Invalid server mapname value '%s'", mapname.data()));
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto check_file = [&](const usermap_file& file)
|
const auto check_file = [&](const usermap_file& file)
|
||||||
@ -261,10 +261,10 @@ namespace party
|
|||||||
{
|
{
|
||||||
if (!file.optional)
|
if (!file.optional)
|
||||||
{
|
{
|
||||||
std::string missing_value = "Server %s is empty";
|
std::string missing_value = "Server '%s' is empty";
|
||||||
if (file.name == "usermap_hash"s)
|
if (file.name == "usermap_hash"s)
|
||||||
{
|
{
|
||||||
missing_value += " (or you are missing content for map '%s')\n";
|
missing_value += " (or you are missing content for map '%s')";
|
||||||
}
|
}
|
||||||
throw std::runtime_error(utils::string::va(missing_value.data(), file.name.data(), mapname.data()));
|
throw std::runtime_error(utils::string::va(missing_value.data(), file.name.data(), mapname.data()));
|
||||||
}
|
}
|
||||||
@ -306,7 +306,7 @@ namespace party
|
|||||||
|
|
||||||
if (!server_fs_game.starts_with("mods/") || server_fs_game.contains('.') || server_fs_game.contains("::"))
|
if (!server_fs_game.starts_with("mods/") || server_fs_game.contains('.') || server_fs_game.contains("::"))
|
||||||
{
|
{
|
||||||
throw std::runtime_error(utils::string::va("Invalid server fs_game value %s\n", server_fs_game.data()));
|
throw std::runtime_error(utils::string::va("Invalid server fs_game value '%s'", server_fs_game.data()));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto needs_restart = false;
|
auto needs_restart = false;
|
||||||
@ -321,7 +321,7 @@ namespace party
|
|||||||
}
|
}
|
||||||
|
|
||||||
throw std::runtime_error(
|
throw std::runtime_error(
|
||||||
utils::string::va("Connection failed: Server %s is empty.", file.name.data()));
|
utils::string::va("Server '%s' is empty", file.name.data()));
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto file_path = server_fs_game + "/mod" + file.extension;
|
const auto file_path = server_fs_game + "/mod" + file.extension;
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
#include <std_include.hpp>
|
#include <std_include.hpp>
|
||||||
|
|
||||||
|
#include "component/motd.hpp"
|
||||||
|
#include "component/scheduler.hpp"
|
||||||
|
|
||||||
#include <utils/http.hpp>
|
#include <utils/http.hpp>
|
||||||
#include "../services.hpp"
|
#include "../services.hpp"
|
||||||
|
|
||||||
@ -14,67 +17,21 @@ namespace demonware
|
|||||||
|
|
||||||
void bdMarketingComms::getMessages(service_server* server, byte_buffer* /*buffer*/) const
|
void bdMarketingComms::getMessages(service_server* server, byte_buffer* /*buffer*/) const
|
||||||
{
|
{
|
||||||
/*auto reply = server->create_reply(this->task_id());
|
|
||||||
|
|
||||||
const int timeout = 7; // seconds
|
|
||||||
|
|
||||||
std::optional<utils::http::result> motd_content;
|
|
||||||
std::optional<utils::http::result> featured_content;
|
|
||||||
std::optional<utils::http::result> featured2_content;
|
|
||||||
|
|
||||||
auto get_motd = [&motd_content]()
|
|
||||||
{
|
|
||||||
motd_content = utils::http::get_data("https://h1.gg/data/motd.json", {}, {}, {}, timeout);
|
|
||||||
};
|
|
||||||
auto get_featured = [&featured_content]()
|
|
||||||
{
|
|
||||||
featured_content = utils::http::get_data("https://h1.gg/data/featured.json", {}, {}, {}, timeout);
|
|
||||||
};
|
|
||||||
auto get_featured2 = [&featured2_content]()
|
|
||||||
{
|
|
||||||
featured2_content = utils::http::get_data("https://h1.gg/data/featured2.json", {}, {}, {}, timeout);
|
|
||||||
};
|
|
||||||
|
|
||||||
std::thread get_motd_thread(get_motd);
|
|
||||||
std::thread get_featured_thread(get_featured);
|
|
||||||
std::thread get_featured2_thread(get_featured2);
|
|
||||||
|
|
||||||
get_motd_thread.join();
|
|
||||||
get_featured_thread.join();
|
|
||||||
get_featured2_thread.join();
|
|
||||||
|
|
||||||
if (motd_content.has_value())
|
|
||||||
{
|
|
||||||
const auto motd = new bdMarketingMessage;
|
|
||||||
motd->m_messageID = 1;
|
|
||||||
motd->m_languageCode = "en-US";
|
|
||||||
motd->m_content = motd_content.value().buffer.data();
|
|
||||||
motd->m_metadata = "{}";
|
|
||||||
reply->add(motd);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (featured_content.has_value())
|
|
||||||
{
|
|
||||||
const auto featured = new bdMarketingMessage;
|
|
||||||
featured->m_messageID = 2;
|
|
||||||
featured->m_languageCode = "en-US";
|
|
||||||
featured->m_content = featured_content.value().buffer.data();
|
|
||||||
featured->m_metadata = "{}";
|
|
||||||
reply->add(featured);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (featured2_content.has_value())
|
|
||||||
{
|
|
||||||
const auto featured2 = new bdMarketingMessage;
|
|
||||||
featured2->m_messageID = 3;
|
|
||||||
featured2->m_languageCode = "en-US";
|
|
||||||
featured2->m_content = featured2_content.value().buffer.data();
|
|
||||||
featured2->m_metadata = "{}";
|
|
||||||
reply->add(featured2);
|
|
||||||
}
|
|
||||||
|
|
||||||
reply->send();*/
|
|
||||||
auto reply = server->create_reply(this->task_id());
|
auto reply = server->create_reply(this->task_id());
|
||||||
|
|
||||||
|
int message_id = 1;
|
||||||
|
const auto featured_content = motd::get_featured_content();
|
||||||
|
for (const auto& [key, value] : featured_content)
|
||||||
|
{
|
||||||
|
const auto marketing_message = new bdMarketingMessage;
|
||||||
|
marketing_message->m_messageID = message_id;
|
||||||
|
marketing_message->m_languageCode = "en-US";
|
||||||
|
marketing_message->m_content = value.buffer;
|
||||||
|
marketing_message->m_metadata = "{}";
|
||||||
|
reply->add(marketing_message);
|
||||||
|
++message_id;
|
||||||
|
}
|
||||||
|
|
||||||
reply->send();
|
reply->send();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user