Skip to content

Commit d50cac7

Browse files
committed
dfsa
1 parent 8ba88ac commit d50cac7

File tree

10 files changed

+194
-82
lines changed

10 files changed

+194
-82
lines changed

changelog.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
### Some minor fixes
33
- <cy>Fix saving from GDPS Hub and a deletion issue (found by tt_kybersport)</c>
44
- <cy>Make deleting a server delete the save file</c>
5+
- <cy>Moving a server's save dir now moves the save files</c>
6+
- <cy>Return the old sound library fix while I work on a more permanent solution</c>
57
# 1.4.1
68
### API Fix
79
- <cy>Fix API for mods like GDPS Hub (found by tt_kybersport)</c>

src/apis/GDPSUtils.cpp

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include "../ui/ServerListLayer.hpp"
55
#include "../utils/GDPSMain.hpp"
66
#include <km7dev.server_api/include/ServerAPIEvents.hpp>
7-
7+
#include "../utils/ServerInfoManager.hpp"
88
using namespace geode::prelude;
99

1010
Result<int> GDPSUtils::createServer(std::string name, std::string url, std::string saveDir) {
@@ -62,14 +62,26 @@ Result<bool> GDPSUtils::deleteServer(int id) {
6262
if (it == GDPSMain::get()->m_servers.end()) {
6363
return Err("Server not found");
6464
}
65-
if (GDPSMain::get()->m_currentServer == id) {
65+
auto main = GDPSMain::get();
66+
main->m_shouldSaveGameData = false;
67+
auto serverPath = geode::dirs::getSaveDir() / "gdpses" / it->second.saveDir;
68+
auto gdpsesDir = geode::dirs::getSaveDir() / "gdpses";
69+
if (std::filesystem::exists(serverPath)) {
70+
if (std::filesystem::canonical(serverPath).string().starts_with(gdpsesDir.string()) && serverPath != gdpsesDir) {
71+
log::debug("Deleting {}", serverPath);
72+
std::filesystem::remove_all(serverPath);
73+
} else {
74+
log::warn("Attempted to delete a path outside or equal to the gdpses directory: {}", serverPath);
75+
return Err(fmt::format("Save directory {} is outside or equal to the gdpses directory and cannot be deleted automatically.", serverPath.string()));
76+
}
77+
}
78+
if (ServerListLayer::m_selectedServer == it->second.id) {
6679
ServerListLayer::m_selectedServer = -2;
6780
Mod::get()->setSavedValue("current", -2);
68-
GDPSMain::get()->m_shouldSaveGameData = false;
69-
std::filesystem::remove_all(geode::dirs::getSaveDir() / "gdpses" / it->second.saveDir);
81+
main->m_shouldSaveGameData = false;
7082
}
71-
GDPSMain::get()->m_servers.erase(it);
72-
GDPSMain::get()->save();
83+
main->m_servers.erase(it);
84+
main->save();
7385
return Ok(true);
7486
}
7587

@@ -91,22 +103,48 @@ Result<GDPSTypes::Server> GDPSUtils::getServerInfo(int id) {
91103
}
92104

93105
Result<bool> GDPSUtils::setServerInfo(int id, std::string name, std::string url, std::string saveDir) {
94-
auto it = GDPSMain::get()->m_servers.find(id);
95-
if (it == GDPSMain::get()->m_servers.end()) {
106+
auto gdpsMain = GDPSMain::get();
107+
auto it = gdpsMain->m_servers.find(id);
108+
if (it == gdpsMain->m_servers.end()) {
96109
return Err("Server not found");
97110
}
111+
98112
auto &server = it->second;
113+
114+
if (!saveDir.empty() && saveDir != server.saveDir) {
115+
auto newSaveDirPath = geode::dirs::getSaveDir() / "gdpses" / saveDir;
116+
auto oldSaveDirPath = geode::dirs::getSaveDir() / "gdpses" / server.saveDir;
117+
118+
if (std::filesystem::exists(newSaveDirPath)) {
119+
auto gdpsesDir = geode::dirs::getSaveDir() / "gdpses";
120+
if (!std::filesystem::canonical(newSaveDirPath).string().starts_with(gdpsesDir.string()) || std::filesystem::equivalent(newSaveDirPath, gdpsesDir)) {
121+
log::warn("{} already exists and is not part of the gdpses subdirectory or is the gdpses directory itself - will not delete.", newSaveDirPath.string());
122+
return Err("Save directory already exists and cannot be overwritten.");
123+
}
124+
std::filesystem::remove_all(newSaveDirPath);
125+
}
126+
127+
if (std::filesystem::exists(oldSaveDirPath)) {
128+
std::filesystem::rename(oldSaveDirPath, newSaveDirPath);
129+
}
130+
131+
server.saveDir = saveDir;
132+
}
133+
99134
if (!name.empty()) {
100135
server.name = name;
101136
}
137+
102138
if (!url.empty()) {
103139
server.url = url;
104140
}
105-
if (!saveDir.empty()) {
106-
server.saveDir = saveDir;
107-
}
108-
if (GDPSMain::get()->m_currentServer == id) {
109-
ServerAPIEvents::updateServer(GDPSMain::get()->m_serverApiId, server.url);
141+
142+
if (gdpsMain->m_currentServer == id) {
143+
ServerAPIEvents::updateServer(gdpsMain->m_serverApiId, server.url);
110144
}
145+
146+
ServerInfoManager::get()->fetch(server);
147+
gdpsMain->save();
148+
111149
return Ok(true);
112150
}

src/hooks/DataSave.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#include "../utils/GDPSMain.hpp"
2+
3+
using namespace geode::prelude;
4+
5+
$on_mod(DataSaved) {
6+
if (Mod::get()->getRequestedAction() == ModRequestedAction::Disable ||
7+
Mod::get()->getRequestedAction() == ModRequestedAction::Uninstall ||
8+
Mod::get()->getRequestedAction() ==
9+
ModRequestedAction::UninstallWithSaveData ||
10+
GDPSMain::get()->m_switching == true) {
11+
log::debug("Deleting music library and SFX library");
12+
log::debug("Cache dir: {}",
13+
std::string(CCFileUtils::sharedFileUtils()->getWritablePath()));
14+
if (std::filesystem::exists(
15+
std::string(CCFileUtils::sharedFileUtils()->getWritablePath()) +
16+
"musiclibrary.dat"))
17+
std::filesystem::remove(
18+
std::string(CCFileUtils::sharedFileUtils()->getWritablePath()) +
19+
"musiclibrary.dat");
20+
else
21+
log::debug("Music library was not at {}!",
22+
std::string(CCFileUtils::sharedFileUtils()->getWritablePath()) +
23+
"musiclibrary.dat");
24+
if (std::filesystem::exists(
25+
std::string(CCFileUtils::sharedFileUtils()->getWritablePath()) +
26+
"sfxlibrary.dat"))
27+
std::filesystem::remove(
28+
std::string(CCFileUtils::sharedFileUtils()->getWritablePath()) +
29+
"sfxlibrary.dat");
30+
else
31+
log::debug("SFX library was not at {}!",
32+
std::string(CCFileUtils::sharedFileUtils()->getWritablePath()) +
33+
"sfxlibrary.dat");
34+
}
35+
}

src/hooks/GManager.cpp

Lines changed: 32 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,48 @@
1+
#include "GManager.hpp"
12
#include "../utils/GDPSMain.hpp"
23

3-
#include <Geode/Geode.hpp>
4-
#include <Geode/modify/GManager.hpp>
4+
std::vector<GSGManager*> GSGManager::Fields::m_managers = {};
55

6-
using namespace geode::prelude;
6+
void GSGManager::setup() {
7+
if (getUserObject("DONT_CHANGE_DIR"_spr)) return GManager::setup();
8+
const auto main = GDPSMain::get();
9+
if (!main->isActive()) return GManager::setup();
10+
if (m_fields->m_originalFileName != "") return GManager::setup();
11+
12+
m_fields->m_originalFileName = m_fileName;
13+
GSGManager::Fields::m_managers.push_back(this);
714

8-
class $modify(GSGManager, GManager) {
15+
auto server = main->m_servers[main->m_currentServer];
16+
const auto dir = geode::dirs::getSaveDir() / "gdpses" / server.saveDir;
917

10-
struct Fields {
11-
static std::vector<GSGManager*> m_managers;
12-
std::string m_originalFileName;
13-
};
18+
std::error_code error;
19+
if (!std::filesystem::exists(dir) && !std::filesystem::create_directory(dir, error)) {
20+
main->registerIssue(fmt::format("Failed to setup save file: {}", error.message()));
21+
return log::error("Failed to create directory '{}', data will not save: {}", dir.string(), error.message());
22+
}
1423

15-
void setup() override {
16-
if (getUserObject("GDPS_DONT_CHANGE"_spr)) return GManager::setup();
17-
const auto main = GDPSMain::get();
18-
if (!main->isActive()) return GManager::setup();
19-
if (m_fields->m_originalFileName != "") return GManager::setup();
20-
21-
m_fields->m_originalFileName = m_fileName;
22-
GSGManager::Fields::m_managers.push_back(this);
24+
m_fileName = fmt::format("gdpses/{}/{}", server.saveDir, m_fileName);
25+
GManager::setup();
26+
}
27+
28+
void GSGManager::save() {
29+
if (GDPSMain::get()->m_shouldSaveGameData) GManager::save();
30+
}
2331

32+
void GSGManager::updateFileNames() {
33+
log::debug("Updating filenames");
34+
for (auto manager : Fields::m_managers) {
35+
if (!manager) continue;
36+
const auto main = GDPSMain::get();
2437
auto server = main->m_servers[main->m_currentServer];
2538
const auto dir = geode::dirs::getSaveDir() / "gdpses" / server.saveDir;
26-
2739
std::error_code error;
2840
if (!std::filesystem::exists(dir) && !std::filesystem::create_directory(dir, error)) {
2941
main->registerIssue(fmt::format("Failed to setup save file: {}", error.message()));
3042
return log::error("Failed to create directory '{}', data will not save: {}", dir.string(), error.message());
3143
}
32-
33-
m_fileName = fmt::format("gdpses/{}/{}", server.saveDir, m_fileName);
34-
GManager::setup();
35-
}
36-
void save() {
37-
if (GDPSMain::get()->m_shouldSaveGameData) GManager::save();
38-
}
39-
static void updateFileName() {
40-
41-
42-
43-
for (auto manager : Fields::m_managers) {
44-
const auto main = GDPSMain::get();
45-
auto server = main->m_servers[main->m_currentServer];
46-
const auto dir = geode::dirs::getSaveDir() / "gdpses" / server.saveDir;
47-
std::error_code error;
48-
if (!std::filesystem::exists(dir) && !std::filesystem::create_directory(dir, error)) {
49-
main->registerIssue(fmt::format("Failed to setup save file: {}", error.message()));
50-
return log::error("Failed to create directory '{}', data will not save: {}", dir.string(), error.message());
51-
}
52-
if (main->isActive()) {
53-
manager->m_fileName = fmt::format("gdpses/{}/{}", server.saveDir, manager->m_fields->m_originalFileName);
54-
}
44+
if (main->isActive()) {
45+
manager->m_fileName = fmt::format("gdpses/{}/{}", server.saveDir, manager->m_fields->m_originalFileName);
5546
}
5647
}
57-
};
58-
59-
std::vector<GSGManager*> GSGManager::Fields::m_managers = {};
48+
}

src/hooks/GManager.hpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#pragma once
2+
3+
#include <Geode/Geode.hpp>
4+
#include <Geode/modify/GManager.hpp>
5+
6+
using namespace geode::prelude;
7+
8+
class $modify(GSGManager, GManager) {
9+
10+
struct Fields {
11+
static std::vector<GSGManager*> m_managers;
12+
std::string m_originalFileName;
13+
};
14+
15+
void setup() override;
16+
void save();
17+
static void updateFileNames();
18+
};

src/hooks/MusicDownloadManager.cpp

Lines changed: 0 additions & 21 deletions
This file was deleted.

src/ui/ModifyServerPopup.cpp

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "Types.hpp"
66
#include <regex>
77
#include <km7dev.server_api/include/ServerAPIEvents.hpp>
8+
#include "../hooks/GManager.hpp"
89

910
bool ModifyServerPopup::setup(GDPSTypes::Server server, ServerListLayer * layer) {
1011
this->m_listLayer = layer;
@@ -157,9 +158,45 @@ void ModifyServerPopup::onSave(cocos2d::CCObject *sender) {
157158
if (!gdpsMain->m_servers.contains(server.id)) {
158159
return;
159160
}
161+
auto newSaveDir = m_saveInput->getString().empty() ? fmt::format("{}", m_server.id) : m_saveInput->getString();
162+
if (newSaveDir != server.saveDir) {
163+
auto path = geode::dirs::getSaveDir() / "gdpses" / newSaveDir;
164+
if (std::filesystem::exists(path)) {
165+
auto gdpsesDir = geode::dirs::getSaveDir() / "gdpses";
166+
if (!std::filesystem::canonical(path).string().starts_with(gdpsesDir.string()) || std::filesystem::equivalent(path, gdpsesDir)) {
167+
log::warn("{} already exists and is not part of the gdpses subdirectory or is the gdpses directory itself - will not delete.", path.string());
168+
MDPopup::create("Hold up!", fmt::format("The save directory you chose already exists! GDPS Switcher will not automatically delete anything outside of `{}` or the directory itself to prevent extra data loss.", gdpsesDir.string()), "OK")->show();
169+
return;
170+
}
171+
geode::createQuickPopup("Hold up!", "The save directory you chose already exists! Do you want to overwrite it?", "No", "Yes", [this, path, newSaveDir, sender](auto, bool yes) {
172+
if (yes) {
173+
auto gdpsMain = GDPSMain::get();
174+
auto &server = gdpsMain->m_servers[m_server.id];
175+
std::filesystem::remove_all(path);
176+
if (std::filesystem::exists(geode::dirs::getSaveDir() / "gdpses" / server.saveDir)) std::filesystem::rename(geode::dirs::getSaveDir() / "gdpses" / server.saveDir, path);
177+
server.saveDir = newSaveDir;
178+
server.name = m_nameInput->getString();
179+
server.url = m_urlInput->getString();
180+
if (gdpsMain->m_currentServer == server.id) {
181+
ServerAPIEvents::updateServer(GDPSMain::get()->m_serverApiId, server.url);
182+
GSGManager::updateFileNames();
183+
}
184+
ServerInfoManager::get()->fetch(server);
185+
m_listLayer->updateList();
186+
GDPSMain::get()->save();
187+
Popup::onClose(sender);
188+
}
189+
});
190+
return;
191+
}
192+
if (std::filesystem::exists(geode::dirs::getSaveDir() / "gdpses" / server.saveDir)) std::filesystem::rename(geode::dirs::getSaveDir() / "gdpses" / server.saveDir, path);
193+
server.saveDir = newSaveDir;
194+
if (gdpsMain->m_currentServer == server.id) {
195+
GSGManager::updateFileNames();
196+
}
197+
}
160198
server.name = m_nameInput->getString();
161199
server.url = m_urlInput->getString();
162-
server.saveDir = m_saveInput->getString().empty() ? fmt::format("{}", m_server.id) : m_saveInput->getString();
163200
if (gdpsMain->m_currentServer == server.id) {
164201
ServerAPIEvents::updateServer(GDPSMain::get()->m_serverApiId, server.url);
165202
}

src/ui/ServerListLayer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,7 @@ cocos2d::CCScene *ServerListLayer::scene() {
251251

252252
void ServerListLayer::onSelect(const GDPSTypes::Server &server) const {
253253
m_selectedServer = server.id;
254+
GDPSMain::get()->m_switching = m_selectedServer != GDPSMain::get()->m_currentServer;
254255
for (auto node : CCArrayExt<ServerNode>(m_scroll->m_contentLayer->getChildren())) {
255256
if (!node) return;
256257
node->updateSelected(server);

src/ui/ServerNode.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -250,12 +250,24 @@ void ServerNode::onDelete(CCObject *sender) {
250250
if (second) {
251251
auto main = GDPSMain::get();
252252
main->m_shouldSaveGameData = false;
253-
std::filesystem::remove_all(geode::dirs::getSaveDir() / "gdpses" / m_server.saveDir);
254-
log::debug("Deleting {}", geode::dirs::getSaveDir() / "gdpses" / m_server.saveDir);
253+
auto serverPath = geode::dirs::getSaveDir() / "gdpses" / m_server.saveDir;
254+
auto gdpsesDir = geode::dirs::getSaveDir() / "gdpses";
255+
if (std::filesystem::exists(serverPath)) {
256+
if (std::filesystem::canonical(serverPath).string().starts_with(gdpsesDir.string()) && serverPath != gdpsesDir) {
257+
log::debug("Deleting {}", serverPath);
258+
std::filesystem::remove_all(serverPath);
259+
} else {
260+
log::warn("Attempted to delete a path outside or equal to the gdpses directory: {}", serverPath);
261+
MDPopup::create("Did not delete save", fmt::format("To prevent unintentional extra data loss, your save was not deleted - only saves within {} will be deleted. If you want to delete this data, do it manually.", gdpsesDir), "OK")->show();
262+
}
263+
}
264+
if (m_listLayer->m_selectedServer == m_server.id) {
265+
m_listLayer->m_selectedServer = -2;
266+
Mod::get()->setSavedValue("current", -2);
267+
GDPSMain::get()->m_shouldSaveGameData = false;
268+
}
255269
main->m_servers.erase(m_server.id);
256270
main->save();
257-
m_listLayer->m_selectedServer = -2;
258-
Mod::get()->setSavedValue("current", -2);
259271
m_listLayer->updateList();
260272
}
261273
});

src/utils/GDPSMain.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ class GDPSMain {
2525
int m_currentServer = -2;
2626
int m_serverApiId = 0;
2727
bool m_shouldSaveGameData = true;
28+
bool m_switching = false;
2829
};

0 commit comments

Comments
 (0)