Meta parsing stuff
This commit is contained in:
parent
b6b70fed17
commit
1c726f7d0f
8
.clang-format
Normal file
8
.clang-format
Normal file
|
@ -0,0 +1,8 @@
|
|||
---
|
||||
IndentWidth: 4
|
||||
TabWidth: 4
|
||||
UseTab: Always
|
||||
ContinuationIndentWidth: 4
|
||||
---
|
||||
Language: Cpp
|
||||
AccessModifierOffset: -4
|
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -1,3 +1,6 @@
|
|||
[submodule "lib/wx"]
|
||||
path = lib/wx
|
||||
url = https://github.com/wxWidgets/wxWidgets.git
|
||||
[submodule "lib/json"]
|
||||
path = lib/json
|
||||
url = https://github.com/nlohmann/json.git
|
||||
|
|
|
@ -2,7 +2,4 @@ cmake_minimum_required(VERSION 3.25)
|
|||
project(leapfrog)
|
||||
|
||||
add_subdirectory(lib)
|
||||
|
||||
add_executable(leapfrog main.cpp)
|
||||
target_link_libraries(leapfrog PRIVATE wx::base wx::core wx::net)
|
||||
include_directories(lib/wx/include)
|
||||
add_subdirectory(installer)
|
||||
|
|
7
installer/CMakeLists.txt
Normal file
7
installer/CMakeLists.txt
Normal file
|
@ -0,0 +1,7 @@
|
|||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
|
||||
configure_file(info.hpp.in info.hpp)
|
||||
add_executable(installer main.cpp ui.cpp ui.hpp meta.cpp meta.hpp info.hpp)
|
||||
target_link_libraries(installer PRIVATE wx::base wx::core wx::net)
|
||||
include_directories(lib/wx/include)
|
||||
include_directories(lib/json/include)
|
7
installer/info.hpp.in
Normal file
7
installer/info.hpp.in
Normal file
|
@ -0,0 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <wx/string.h>
|
||||
|
||||
namespace info {
|
||||
const wxString USER_AGENT("Leapfrog Installer/@leapfrog_VERSION@");
|
||||
}
|
23
installer/main.cpp
Normal file
23
installer/main.cpp
Normal file
|
@ -0,0 +1,23 @@
|
|||
#include "meta.hpp"
|
||||
#include "ui.hpp"
|
||||
#include <iostream>
|
||||
#include <wx/app.h>
|
||||
|
||||
class App final : public wxApp {
|
||||
public:
|
||||
bool OnInit() override {
|
||||
if (!wxApp::OnInit())
|
||||
return false;
|
||||
|
||||
wxLog::SetActiveTarget(new wxLogStream(&std::cout));
|
||||
|
||||
get_loader_versions(this, [](auto) {});
|
||||
|
||||
auto *window = new InstallerWindow;
|
||||
window->Show();
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
wxIMPLEMENT_APP(App);
|
73
installer/meta.cpp
Normal file
73
installer/meta.cpp
Normal file
|
@ -0,0 +1,73 @@
|
|||
#include "meta.hpp"
|
||||
#include "info.hpp"
|
||||
#include <nlohmann/json.hpp>
|
||||
#include <wx/log.h>
|
||||
#include <wx/webrequest.h>
|
||||
|
||||
static wxString meta_url(const wxString &url) {
|
||||
return "https://meta.frogmc.dev/v1/" + url;
|
||||
}
|
||||
|
||||
static LoaderVersion make_loader_version(const nlohmann::json &value) {
|
||||
wxDateTime release_date(static_cast<time_t>(0));
|
||||
release_date.ParseISOCombined(
|
||||
wxString::FromUTF8(value.value("dateTime", std::string())));
|
||||
|
||||
return {wxString::FromUTF8(value.value("version", std::string())),
|
||||
release_date,
|
||||
wxString::FromUTF8(value.value("downloadUrl", std::string()))};
|
||||
}
|
||||
|
||||
void get_loader_versions(
|
||||
wxEvtHandler *handler,
|
||||
const std::function<void(std::optional<std::vector<LoaderVersion>>)>
|
||||
&callback) {
|
||||
wxWebRequest request = wxWebSession::GetDefault().CreateRequest(
|
||||
handler, meta_url("loader/versions"));
|
||||
|
||||
if (!request.IsOk()) {
|
||||
wxLogError("Invalid request object");
|
||||
callback({});
|
||||
return;
|
||||
}
|
||||
|
||||
request.SetHeader("User-Agent", info::USER_AGENT);
|
||||
handler->Bind(wxEVT_WEBREQUEST_STATE, [callback](wxWebRequestEvent &event) {
|
||||
if (event.GetState() == wxWebRequest::State_Completed) {
|
||||
const nlohmann::json response = nlohmann::json::parse(
|
||||
event.GetResponse().AsString().utf8_string());
|
||||
|
||||
if (!response.is_array()) {
|
||||
wxLogError("Response is not an array");
|
||||
callback({});
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<LoaderVersion> result;
|
||||
|
||||
size_t i = 0;
|
||||
|
||||
for (const auto &value : response) {
|
||||
result.push_back(make_loader_version(value));
|
||||
|
||||
if (!result.back().is_valid()) {
|
||||
wxLogError("Invalid loader version object: %s",
|
||||
value.dump(4));
|
||||
callback({});
|
||||
return;
|
||||
}
|
||||
|
||||
++i;
|
||||
}
|
||||
|
||||
callback({std::move(result)});
|
||||
return;
|
||||
} else if (event.GetState() == wxWebRequest::State_Failed) {
|
||||
wxLogError("Request failed: %s", event.GetErrorDescription());
|
||||
callback({});
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
request.Start();
|
||||
}
|
20
installer/meta.hpp
Normal file
20
installer/meta.hpp
Normal file
|
@ -0,0 +1,20 @@
|
|||
#pragma once
|
||||
|
||||
#include <optional>
|
||||
#include <wx/datetime.h>
|
||||
#include <wx/event.h>
|
||||
|
||||
struct LoaderVersion {
|
||||
wxString version;
|
||||
wxDateTime release_date;
|
||||
wxString download_url;
|
||||
|
||||
bool is_valid() const {
|
||||
return !version.IsEmpty() && release_date.IsValid() &&
|
||||
!download_url.IsEmpty();
|
||||
}
|
||||
};
|
||||
|
||||
void get_loader_versions(
|
||||
wxEvtHandler *handler,
|
||||
const std::function<void(std::optional<std::vector<LoaderVersion>>)> &callback);
|
3
installer/ui.cpp
Normal file
3
installer/ui.cpp
Normal file
|
@ -0,0 +1,3 @@
|
|||
#include "ui.hpp"
|
||||
|
||||
InstallerWindow::InstallerWindow() {}
|
8
installer/ui.hpp
Normal file
8
installer/ui.hpp
Normal file
|
@ -0,0 +1,8 @@
|
|||
#pragma once
|
||||
|
||||
#include "wx/window.h"
|
||||
|
||||
class InstallerWindow final : public wxWindow {
|
||||
public:
|
||||
explicit InstallerWindow();
|
||||
};
|
1
lib/json
Submodule
1
lib/json
Submodule
|
@ -0,0 +1 @@
|
|||
Subproject commit 8c391e04fe4195d8be862c97f38cfe10e2a3472e
|
Loading…
Reference in a new issue