#include "pch.h" #include "WinDurangoConfig.h" #include #include #include using namespace winrt::Windows::Storage; WinDurangoConfig& WinDurangoConfig::Instance() { static WinDurangoConfig instance; return instance; } WinDurangoConfigData WinDurangoConfig::GetData() const { return _data; } void WinDurangoConfig::SetData(const WinDurangoConfigData& data) { _data = data; } using namespace std::string_view_literals; void WinDurangoConfig::ProcessConfigFile() { static constexpr auto default_config_data = R"( [WinDurango] Gamertag = "TheDurangler2" Gamerscore = 1500 Reputation = 5 Game = "Minecraft" AgeGroup = "Adult" [KeyboardMapping] A = 32 B = 81 X = 82 Y = 69 Up = 38 Down = 40 Left = 37 Right = 39 Menu = 13 View = 27 LThumb = 161 RThumb = 160 LShoulder = 162 RShoulder = 163 LTrigger = 2 RTrigger = 1 MovThumbY = 87 MovThumbYM = 83 MovThumbX = 68 MovThumbXM = 65 MovementStick = "Left" MouseStick = "Right" )"sv; try { /* * We need to use WinRT Storage APIs in UWP */ StorageFolder localFolder = ApplicationData::Current().LocalFolder(); std::wstring folderPath = std::wstring(localFolder.Path()); std::filesystem::path cfgPath = std::filesystem::path(folderPath) / L"config.toml"; if (!std::filesystem::exists(cfgPath)) { winrt::Windows::Storage::StorageFile file = localFolder .CreateFileAsync(L"config.toml", winrt::Windows::Storage::CreationCollisionOption::ReplaceExisting) .get(); std::wstring_convert> converter; std::wstring wide = converter.from_bytes(std::string(default_config_data)); winrt::Windows::Storage::FileIO::WriteTextAsync(file, wide).get(); } StorageFile file = ApplicationData::Current().LocalFolder().GetFileAsync(L"config.toml").get(); std::wstring cfdata = std::wstring(FileIO::ReadTextAsync(file).get()); std::string ConfigData(cfdata.begin(), cfdata.end()); auto tbl = toml::parse(ConfigData); auto gamertag_opt = tbl["WinDurango"]["Gamertag"].value(); auto gamerscore_opt = tbl["WinDurango"]["Gamerscore"].value(); auto reputation_opt = tbl["WinDurango"]["Reputation"].value(); auto agegroup_opt = tbl["WinDurango"]["AgeGroup"].value(); auto game_opt = tbl["WinDurango"]["Game"].value(); auto a_opt = tbl["KeyboardMapping"]["A"].value(); auto b_opt = tbl["KeyboardMapping"]["B"].value(); auto x_opt = tbl["KeyboardMapping"]["X"].value(); auto y_opt = tbl["KeyboardMapping"]["Y"].value(); auto up_opt = tbl["KeyboardMapping"]["Up"].value(); auto down_opt = tbl["KeyboardMapping"]["Down"].value(); auto left_opt = tbl["KeyboardMapping"]["Left"].value(); auto right_opt = tbl["KeyboardMapping"]["Right"].value(); auto menu_opt = tbl["KeyboardMapping"]["Menu"].value(); auto view_opt = tbl["KeyboardMapping"]["View"].value(); auto lthumb_opt = tbl["KeyboardMapping"]["LThumb"].value(); auto rthumb_opt = tbl["KeyboardMapping"]["RThumb"].value(); auto lshoulder_opt = tbl["KeyboardMapping"]["LShoulder"].value(); auto rshoulder_opt = tbl["KeyboardMapping"]["RShoulder"].value(); auto ltrigger_opt = tbl["KeyboardMapping"]["LTrigger"].value(); auto rtrigger_opt = tbl["KeyboardMapping"]["RTrigger"].value(); auto movthumby_opt = tbl["KeyboardMapping"]["MovThumbY"].value(); auto movthumbym_opt = tbl["KeyboardMapping"]["MovThumbYM"].value(); auto movthumbx_opt = tbl["KeyboardMapping"]["MovThumbX"].value(); auto movthumbxm_opt = tbl["KeyboardMapping"]["MovThumbXM"].value(); auto movstick_opt = tbl["KeyboardMapping"]["MovementStick"].value(); auto mousestick_opt = tbl["KeyboardMapping"]["MouseStick"].value(); const WinDurangoConfigData data { .gamertag = std::string(gamertag_opt.value_or("WinDurango2")), .gamerscore = 0, .reputation = 0, .ageGroup = agegroup_opt.has_value() ? (agegroup_opt.value_or("Adult") == "Child" ? WinDurangoConfigData::AgeGroup::Child : agegroup_opt.value_or("Adult") == "Teen" ? WinDurangoConfigData::AgeGroup::Teen : agegroup_opt.value_or("Adult") == "Adult" ? WinDurangoConfigData::AgeGroup::Adult : WinDurangoConfigData::AgeGroup::Unknown) : WinDurangoConfigData::AgeGroup::Unknown, .game = game_opt.has_value() ? (game_opt.value_or("") == "Minecraft" ? WinDurangoConfigData::Game::Minecraft : game_opt.value_or("") == "Forza Horizon 2" ? WinDurangoConfigData::Game::Forza_Horizon_2 : WinDurangoConfigData::Game::Unknown) : WinDurangoConfigData::Game::Unknown, .A = a_opt.value_or(32), .B = b_opt.value_or(81), .X = x_opt.value_or(82), .Y = y_opt.value_or(69), .Up = up_opt.value_or(38), .Down = down_opt.value_or(40), .Left = left_opt.value_or(37), .Right = right_opt.value_or(39), .Menu = menu_opt.value_or(13), .View = view_opt.value_or(27), .LThumb = lthumb_opt.value_or(161), .RThumb = rthumb_opt.value_or(160), .LShoulder = lshoulder_opt.value_or(162), .RShoulder = rshoulder_opt.value_or(163), .LTrigger = ltrigger_opt.value_or(2), .RTrigger = rtrigger_opt.value_or(1), .MovementThumbY = movthumby_opt.value_or(87), .MovementThumbYM = movthumbym_opt.value_or(83), .MovementThumbX = movthumbx_opt.value_or(68), .MovementThumbXM = movthumbxm_opt.value_or(65), .MovementStick = std::string(movstick_opt.value_or("left")), .MouseStick = std::string(mousestick_opt.value_or("right")), }; SetData(data); } catch (const toml::parse_error& err) { LOG_INFO("WinDurangoConfig || Parsing failed: %s\n", err); const WinDurangoConfigData data { .gamertag = std::string("TheDurangler2"), .gamerscore = 1500, .reputation = 5, .ageGroup = WinDurangoConfigData::AgeGroup::Unknown, .A = 0, .B = 0, .X = 0, .Y = 0, .Up = 0, .Down = 0, .Left = 0, .Right = 0, .Menu = 0, .View = 0, .LThumb = 0, .RThumb = 0, .LShoulder = 0, .RShoulder = 0, .LTrigger = 0, .RTrigger = 0, .MovementThumbY = 0, .MovementThumbYM = 0, .MovementThumbX = 0, .MovementThumbXM = 0, .MovementStick = "left", .MouseStick = "right", }; SetData(data); } } WinDurangoConfig::WinDurangoConfig() { ProcessConfigFile(); }