|
8 | 8 | using namespace geode::prelude; |
9 | 9 |
|
10 | 10 | std::vector<std::string> StatsManager::splitStr(const std::string& str, const std::string& delim) { |
| 11 | + if (delim.empty()) return {}; |
| 12 | + |
11 | 13 | size_t posStart = 0; |
12 | 14 | size_t posEnd; |
13 | 15 | size_t delimLen = delim.length(); |
@@ -116,90 +118,96 @@ std::array<std::string, 62> StatsManager::m_AllFontsMap{ |
116 | 118 | /* main functions |
117 | 119 | ================== */ |
118 | 120 |
|
119 | | -Result<LevelMetadeta> StatsManager::getMetadata(GJGameLevel* const level){ |
| 121 | +Result<LevelMetadeta, ErrorWithCode> StatsManager::getMetadata(GJGameLevel* const level){ |
120 | 122 | GEODE_UNWRAP_INTO(auto levelKey, StatsManager::getLevelKey(level)); |
121 | 123 | return getMetadata(levelKey); |
122 | 124 | } |
123 | | -Result<LevelMetadeta> StatsManager::getMetadata(const std::string& levelKey){ |
| 125 | +Result<LevelMetadeta, ErrorWithCode> StatsManager::getMetadata(const std::string& levelKey){ |
124 | 126 | return getMetadata(getSavesFolderPath() / levelKey); |
125 | 127 | } |
126 | 128 |
|
127 | | -Result<LevelMetadeta> StatsManager::getMetadata(const std::filesystem::path& path){ |
| 129 | +Result<LevelMetadeta, ErrorWithCode> StatsManager::getMetadata(const std::filesystem::path& path){ |
128 | 130 | auto levelSaveFilePath = path / StatsManager::METADATA_FILE_NAME; |
129 | 131 |
|
130 | 132 | if (!std::filesystem::exists(levelSaveFilePath)) |
131 | | - return Err("1 (no stats exist for level!)"); |
| 133 | + return Err(ErrorWithCode("no stats exist for level!", 1)); |
132 | 134 |
|
133 | | - GEODE_UNWRAP_INTO(auto json, file::readJson(levelSaveFilePath)); |
| 135 | + auto readRes = file::readJson(levelSaveFilePath); |
| 136 | + if (readRes.isErr()) return Err("Metadata Corrupted"); |
| 137 | + auto json = readRes.unwrap().as<LevelMetadeta>(); |
| 138 | + if (json.isErr()) return Err("Metadata Corrupted"); |
134 | 139 |
|
135 | | - return json.as<LevelMetadeta>(); |
| 140 | + return Ok(json.unwrap()); |
136 | 141 | } |
137 | 142 |
|
138 | | -Result<Session> StatsManager::getSession(GJGameLevel* const level, long long sessionTime){ |
| 143 | +Result<Session, ErrorWithCode> StatsManager::getSession(GJGameLevel* const level, long long sessionTime){ |
139 | 144 | GEODE_UNWRAP_INTO(auto levelKey, StatsManager::getLevelKey(level)); |
140 | 145 | return getSession(levelKey, sessionTime); |
141 | 146 | } |
142 | | -Result<Session> StatsManager::getSession(const std::string& levelKey, long long sessionTime){ |
| 147 | +Result<Session, ErrorWithCode> StatsManager::getSession(const std::string& levelKey, long long sessionTime){ |
143 | 148 | return getSession(getSavesFolderPath() / levelKey, sessionTime); |
144 | 149 | } |
145 | 150 |
|
146 | | -Result<Session> StatsManager::getSession(const std::filesystem::path& path, long long sessionTime){ |
| 151 | +Result<Session, ErrorWithCode> StatsManager::getSession(const std::filesystem::path& path, long long sessionTime){ |
147 | 152 | auto levelSaveFilePath = path / StatsManager::SESSIONS_DIR_NAME / (std::to_string(sessionTime) + ".dt"); |
148 | 153 |
|
149 | 154 | if (!std::filesystem::exists(levelSaveFilePath)) |
150 | | - return Err("1 (no stats exist for level!)"); |
| 155 | + return Err(ErrorWithCode("no stats exist for level!", 1)); |
151 | 156 |
|
152 | 157 | auto sessionRes = file::readJson(levelSaveFilePath); |
153 | 158 | if (sessionRes.isErr()) return Err("Session Corrupted"); |
154 | 159 | auto session = sessionRes.unwrap().as<Session>(); |
155 | 160 | if (session.isErr()) return Err("Session Corrupted"); |
156 | 161 |
|
157 | | - return session; |
| 162 | + return Ok(session.unwrap()); |
158 | 163 | } |
159 | 164 |
|
160 | | -Result<GeneralData> StatsManager::getGeneral(GJGameLevel* const level){ |
| 165 | +Result<GeneralData, ErrorWithCode> StatsManager::getGeneral(GJGameLevel* const level){ |
161 | 166 | GEODE_UNWRAP_INTO(auto levelKey, StatsManager::getLevelKey(level)); |
162 | 167 | return getGeneral(levelKey); |
163 | 168 | } |
164 | | -Result<GeneralData> StatsManager::getGeneral(const std::string& levelKey){ |
| 169 | +Result<GeneralData, ErrorWithCode> StatsManager::getGeneral(const std::string& levelKey){ |
165 | 170 | return getGeneral(getSavesFolderPath() / levelKey); |
166 | 171 | } |
167 | 172 |
|
168 | | -Result<GeneralData> StatsManager::getGeneral(const std::filesystem::path& path){ |
| 173 | +Result<GeneralData, ErrorWithCode> StatsManager::getGeneral(const std::filesystem::path& path){ |
169 | 174 | auto levelSaveFilePath = path / StatsManager::FROM0_FILE_NAME; |
170 | 175 |
|
171 | 176 | if (!std::filesystem::exists(levelSaveFilePath) || std::filesystem::is_empty(levelSaveFilePath)) |
172 | | - return Err("1(no stats exist for level!)"); |
| 177 | + return Err(ErrorWithCode("no stats exist for level!", 1)); |
173 | 178 |
|
174 | 179 | auto jsonRes = file::readJson(levelSaveFilePath); |
175 | 180 | if (jsonRes.isErr()) return Err("Save Corrupted"); |
176 | 181 | auto genDataRes = jsonRes.unwrap().as<GeneralData>(); |
177 | 182 | if (genDataRes.isErr()) return Err("Save Corrupted"); |
178 | 183 |
|
179 | | - return genDataRes; |
| 184 | + return Ok(genDataRes.unwrap()); |
180 | 185 | } |
181 | 186 |
|
182 | | -Result<LevelData> StatsManager::getLevelData(GJGameLevel* const level){ |
| 187 | +Result<LevelData, ErrorWithCode> StatsManager::getLevelData(GJGameLevel* const level){ |
183 | 188 | GEODE_UNWRAP_INTO(auto levelKey, StatsManager::getLevelKey(level)); |
184 | 189 |
|
185 | 190 | return getLevelData(levelKey); |
186 | 191 | } |
187 | | -Result<LevelData> StatsManager::getLevelData(const std::string& levelKey){ |
| 192 | +Result<LevelData, ErrorWithCode> StatsManager::getLevelData(const std::string& levelKey){ |
188 | 193 | LevelData data; |
| 194 | + |
189 | 195 | GEODE_UNWRAP_INTO(data.metadata, StatsManager::getMetadata(levelKey)); |
| 196 | + |
190 | 197 | data.from0 = StatsManager::getGeneral(levelKey); |
191 | 198 | data.sessionNames = StatsManager::getAllSessionTimesForLevel(levelKey); |
192 | 199 | data.levelKey = levelKey; |
193 | 200 |
|
194 | 201 | return Ok(data); |
195 | 202 | } |
196 | 203 |
|
197 | | -Result<LevelData> StatsManager::getLevelData(const std::filesystem::path& path){ |
| 204 | +Result<LevelData, ErrorWithCode> StatsManager::getLevelData(const std::filesystem::path& path){ |
198 | 205 | LevelData data; |
| 206 | + |
199 | 207 | GEODE_UNWRAP_INTO(data.metadata, StatsManager::getMetadata(path)); |
| 208 | + |
200 | 209 | data.from0 = StatsManager::getGeneral(path); |
201 | 210 | data.sessionNames = StatsManager::getAllSessionTimesForLevel(path); |
202 | | - data.levelKey = data.levelKey; |
203 | 211 |
|
204 | 212 | return Ok(data); |
205 | 213 | } |
@@ -327,7 +335,7 @@ Result<> StatsManager::addBackup(const std::string& levelKey, bool saveLevelStat |
327 | 335 | //log::info("adding backup for level {} | {} | {}", levelKey, saveLevelStats, sessionsToSave); |
328 | 336 | std::error_code ec; |
329 | 337 | auto metaRes = getMetadata(levelKey); |
330 | | - if (metaRes.isErr()) return Err("No level to back up! {}", metaRes.unwrapErr()); |
| 338 | + if (metaRes.isErr()) return Err("No level to back up! {}", metaRes.unwrapErr().error); |
331 | 339 | auto metadata = metaRes.unwrap(); |
332 | 340 |
|
333 | 341 | createFilesIfNeeded(levelKey); |
@@ -460,23 +468,23 @@ void StatsManager::setCurrentLevel(GJGameLevel* const& level){ |
460 | 468 | currentFrom0 = std::nullopt; |
461 | 469 | currentSession = std::nullopt; |
462 | 470 | currentMetadata = std::nullopt; |
463 | | - log::error("Failed to apply current level stats as main stats ({})", metadataRes.unwrapErr()); |
| 471 | + log::error("Failed to apply current level stats as main stats ({})", metadataRes.unwrapErr().error); |
464 | 472 | return; |
465 | 473 | } |
466 | 474 |
|
467 | 475 | if (from0Res.isErr()){ |
468 | | - if (from0Res.unwrapErr()[0] == '1'){ |
| 476 | + if (from0Res.unwrapErr().code == 1){ |
469 | 477 | auto newF0 = GeneralData{.currentBest = -1}; |
470 | 478 |
|
471 | 479 | from0Res = Ok(newF0); |
472 | 480 | } |
473 | 481 | else{ |
474 | | - from0Res = Err("-"); |
| 482 | + from0Res = Err(ErrorWithCode("", 3)); |
475 | 483 | currentFrom0 = std::nullopt; |
476 | 484 | } |
477 | 485 | } |
478 | 486 |
|
479 | | - if (!(from0Res.isErr() && from0Res.unwrapErr() == "-")) |
| 487 | + if (!(from0Res.isErr() && from0Res.unwrapErr().code == 3)) |
480 | 488 | currentFrom0 = from0Res.unwrap(); |
481 | 489 |
|
482 | 490 | currentMetadata = metadataRes.unwrap(); |
@@ -552,7 +560,7 @@ void StatsManager::logDeaths(const std::vector<int>& percents) { |
552 | 560 |
|
553 | 561 | void StatsManager::logRun(const Run& run, bool instantSave) { |
554 | 562 | if (currentLevel == nullptr || !run.start.has_value()) { |
555 | | - log::error("Failed to log deaths"); |
| 563 | + log::error("Failed to log run"); |
556 | 564 | return; |
557 | 565 | } |
558 | 566 |
|
@@ -596,7 +604,6 @@ void StatsManager::logRuns(const std::vector<Run>& runs) { |
596 | 604 | return; |
597 | 605 | } |
598 | 606 |
|
599 | | - bool TrackRun = false; |
600 | 607 | for (int i = 0; i < runs.size(); i++) |
601 | 608 | { |
602 | 609 | logRun(runs[i], false); |
@@ -895,12 +902,12 @@ Result<std::vector<std::pair<std::string, LevelMetadeta>>> StatsManager::getAllL |
895 | 902 | for (int i = 0; i < allLevels.size(); i++) |
896 | 903 | { |
897 | 904 | if (std::filesystem::is_directory(allLevels[i])){ |
898 | | - auto currentDirName = geode::utils::string::pathToString(allLevels[i].parent_path()); |
| 905 | + auto currentDirName = geode::utils::string::pathToString(allLevels[i].filename()); |
899 | 906 | // log::info("Getting level stats for level: {}", currentDirName); |
900 | 907 |
|
901 | 908 | auto currentLevel = StatsManager::getMetadata(currentDirName); |
902 | 909 | if (currentLevel.isErr()){ |
903 | | - Notification::create(fmt::format("failed getting some levels, errors send in logs.", currentDirName, currentLevel.unwrapErr()), nullptr)->show(); |
| 910 | + Notification::create(fmt::format("failed getting some levels, errors send in logs.", currentDirName, currentLevel.unwrapErr().error), nullptr)->show(); |
904 | 911 | failedKeys.push_back(currentDirName); |
905 | 912 | continue; |
906 | 913 | } |
@@ -962,10 +969,6 @@ int StatsManager::getDifficulty(GJGameLevel* const& level){ |
962 | 969 | return 0; |
963 | 970 | } |
964 | 971 |
|
965 | | -void StatsManager::setPath(const std::filesystem::path& path){ |
966 | | - getSavesFolderPath() = path; |
967 | | -} |
968 | | - |
969 | 972 | int StatsManager::getCursorPosition(CCLabelBMFont* const& text, CCLabelBMFont* const& cursor){ |
970 | 973 | if (text->getString() == nullptr) return -1; |
971 | 974 | if (text->getString()[0] == '\0') return -1; |
@@ -1236,7 +1239,7 @@ bool StatsManager::transferPlaytimeFromPT(GJGameLevel* level){ |
1236 | 1239 | return transferPlaytimeFromPT(data, level); |
1237 | 1240 | } |
1238 | 1241 |
|
1239 | | -bool StatsManager::transferPlaytimeFromPT(geode::Result<LevelData>& data, GJGameLevel* level){ |
| 1242 | +bool StatsManager::transferPlaytimeFromPT(geode::Result<LevelData, ErrorWithCode>& data, GJGameLevel* level){ |
1240 | 1243 | std::string lvlID = level->m_levelType == GJLevelType::Editor ? fmt::format("Editor-{}", EditorIDs::getID(level)) : std::to_string(level->m_levelID.value()); |
1241 | 1244 | auto ptPath = Mod::get()->getSaveDir().parent_path() / "nanew.playtime-tracker" / "data" / (lvlID + ".json"); |
1242 | 1245 |
|
|
0 commit comments