diff --git a/CMakeLists.txt b/CMakeLists.txt index 32149723a5..be57bb0c75 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2851,6 +2851,7 @@ set(NativeAssets assets/Inconsolata-Regular.ttf assets/7z.png assets/compat.ini + assets/adhoc-servers.json assets/infra-dns.json assets/gamecontrollerdb.txt assets/langregion.ini diff --git a/Core/HLE/sceNet.cpp b/Core/HLE/sceNet.cpp index ffafd25973..7e1b66d614 100644 --- a/Core/HLE/sceNet.cpp +++ b/Core/HLE/sceNet.cpp @@ -409,7 +409,7 @@ bool PollInfraJsonDownload(std::string *jsonOutput) { std::unique_ptr jsonStr(g_VFS.ReadFile("infra-dns.json", &jsonSize)); if (!jsonStr) { jsonOutput->clear(); - return true; // A clear output but returning true means something vent very wrong. + return true; // A clear output but returning true means something went very wrong. } *jsonOutput = std::string((const char *)jsonStr.get(), jsonSize); // In case there's an old request, get rid of it. diff --git a/Core/HLE/sceNetAdhoc.cpp b/Core/HLE/sceNetAdhoc.cpp index e7bfa0daeb..2ca2cb584e 100644 --- a/Core/HLE/sceNetAdhoc.cpp +++ b/Core/HLE/sceNetAdhoc.cpp @@ -24,12 +24,14 @@ #include #include "Common/Net/SocketCompat.h" +#include "Common/Data/Format/JSONReader.h" #include "Common/Data/Text/I18n.h" #include "Common/Serialize/Serializer.h" #include "Common/Serialize/SerializeFuncs.h" #include "Common/Serialize/SerializeMap.h" #include "Common/System/OSD.h" #include "Common/System/System.h" +#include "Common/File/VFS/VFS.h" #include "Common/Thread/ThreadUtil.h" #include "Common/TimeUtil.h" @@ -105,25 +107,48 @@ static const char *AdhocDataModeToString(AdhocDataMode mode) { return "unknown"; } -const std::vector defaultProAdhocServerList = { - {"Socom Adhoc Server", "socom.cc", "https://discord.com/invite/XtVYDr7", "France", "For players looking to play any games", AdhocDataMode::AemuPostoffice}, - {"Madness Gaming Network", "psp.mgn.pub", "https://discord.com/invite/kaPScVrPes", "Alaska USA", "For players looking to play any games, has a good amount of Monster Hunter players, also provides VPN to work around connection issues as well as P2P mode", AdhocDataMode::AemuPostoffice}, - {"EA Nation Hub", "eahub.eu", "https://discord.com/invite/fwrQHHxrQQ", "France", "Mostly for Medal of Honor Heros 2 & Need For Speed Most Wanted players, but can be used for other games", AdhocDataMode::AemuPostoffice}, - {"Psi-Hate", "psi-hate.com", "https://discord.com/invite/wxeGVkM", "Minnesota USA", "For players looking to play any games", AdhocDataMode::AemuPostoffice}, - {"Relay Brasileiro", "jpa36a7.glddns.com", "https://discord.com/invite/gp45nhdjQJ", "São Paulo Brazil", "For players looking to play any games", AdhocDataMode::AemuPostoffice}, - {"ArenaAnywhere SA", "relay-sa.arenaanywhere.site", "https://discord.gg/GdsXWmNHq5", "South Africa", "For players looking to play any games", AdhocDataMode::AemuPostoffice}, - {"ArenaAnywhere EU", "relay.arenaanywhere.site", "https://discord.gg/GdsXWmNHq5", "Europe", "For players looking to play any games", AdhocDataMode::AemuPostoffice}, - {"ArenaAnywhere Dubai", "relay-dubai.arenaanywhere.site", "https://discord.gg/GdsXWmNHq5", "Dubai", "For players looking to play any games", AdhocDataMode::AemuPostoffice}, - {"Retroverze Relay Beta", "psp.retroverze.my.id", "https://retroverze.my.id/beta", "Unknown", "For players looking to play any games", AdhocDataMode::AemuPostoffice}, - {"Games Nexus", "adhoc.gamesnexus.ovh", "https://adhoc.gamesnexus.ovh", "Milan Italy", "For players looking to play any games", AdhocDataMode::AemuPostoffice}, - {"Sony PSP & PSVita Fans", "psp.gameplayer.club", "https://psp.gameplayer.club/", "Unknown", "For players looking to play any games", AdhocDataMode::P2P}, -}; - // TODO download the list from somewhere and probably cache it on disk // should also make the url configurable and support file:/ local list besides https:// online lists std::mutex g_proAdhocServerListMutex; std::vector g_proAdhocServerList; +bool ParseServerListEntriesJSON(std::string_view json, std::vector *result) { + using namespace json; + + // Use our JSONReader to parse json into a list of AdhocServerListEntry. + json::JsonReader reader(json.data(), json.length()); + + if (!reader.ok() || !reader.root()) { + ERROR_LOG(Log::IO, "Error parsing DNS JSON"); + return false; + } + + const JsonGet root = reader.root(); + + const JsonNode *servers = root.getArray("servers"); + + result->clear(); + + for (const JsonNode *iter : servers->value) { + JsonGet server = iter->value; + AdhocServerListEntry entry; + entry.name = server.getStringOr("name", ""); + entry.discord = server.getStringOr("discord", ""); + entry.host = server.getStringOr("host", ""); + entry.web = server.getStringOr("web", ""); + entry.location = server.getStringOr("location", ""); + entry.description = server.getStringOr("description", ""); + entry.mode = server.getStringOr("data_mode", "") == "AemuPostoffice" ? AdhocDataMode::AemuPostoffice : AdhocDataMode::P2P; + + if (entry.host.empty()) { + // Skipping invalid entry. + continue; + } + result->push_back(entry); + } + return true; +} + void AdhocLoadServerList() { { std::lock_guard guard(g_proAdhocServerListMutex); @@ -139,7 +164,17 @@ void AdhocLoadServerList() { // 1. Cached list in PSP/SYSTEM/CACHE // 2. Online list from some url, and cache it in PSP/SYSTEM/CACHE for next time. std::lock_guard guard(g_proAdhocServerListMutex); - g_proAdhocServerList = defaultProAdhocServerList; + + size_t jsonSize; + std::unique_ptr jsonStr(g_VFS.ReadFile("adhoc-servers.json", &jsonSize)); + if (!jsonStr) { + _dbg_assert_(false); + // Something went wrong. This shouldn't happen. + return; + } + + ParseServerListEntriesJSON(std::string_view((char*)jsonStr.get(), jsonSize), &g_proAdhocServerList); + System_PostUIMessage(UIMessage::ADHOC_SERVER_LIST_CHANGED); }); thread.detach(); @@ -153,7 +188,7 @@ std::vector AdhocGetServerList() { static AdhocDataMode AdhocGetServerDataMode(std::string_view server) { std::vector list = AdhocGetServerList(); for (const auto &item : list) { - if (equals(server, item.hostname)) { + if (equals(server, item.host)) { INFO_LOG(Log::sceNet, "server %.*s is in known list, using data mode %s", STR_VIEW(server), AdhocDataModeToString(item.mode)); return item.mode; } diff --git a/Core/HLE/sceNetAdhoc.h b/Core/HLE/sceNetAdhoc.h index 6db2bb715e..e7d0493798 100644 --- a/Core/HLE/sceNetAdhoc.h +++ b/Core/HLE/sceNetAdhoc.h @@ -105,10 +105,11 @@ enum class AdhocDataMode { struct AdhocServerListEntry { std::string name; - std::string hostname; - std::string community_link; + std::string host; + std::string web; + std::string discord; std::string location; - std::string note; + std::string description; AdhocDataMode mode = AdhocDataMode::P2P; }; diff --git a/UI/AdhocServerScreen.cpp b/UI/AdhocServerScreen.cpp index 483fb3b912..f8b67a3d0c 100644 --- a/UI/AdhocServerScreen.cpp +++ b/UI/AdhocServerScreen.cpp @@ -41,7 +41,7 @@ void AdhocServerScreen::CreatePopupContents(UI::ViewGroup *parent) { std::vector listIP; for (const auto &item : listItems) { - listIP.push_back(item.hostname); + listIP.push_back(item.host); } // Add non-editable items diff --git a/UWP/UWP.vcxproj b/UWP/UWP.vcxproj index 428844c1a4..5f102a770e 100644 --- a/UWP/UWP.vcxproj +++ b/UWP/UWP.vcxproj @@ -388,6 +388,10 @@ true Content\%(Filename)%(Extension) + + true + Content\%(Filename)%(Extension) + true Content\%(Filename)%(Extension) diff --git a/UWP/UWP.vcxproj.filters b/UWP/UWP.vcxproj.filters index e9d9ff7c22..e27a177b12 100644 --- a/UWP/UWP.vcxproj.filters +++ b/UWP/UWP.vcxproj.filters @@ -216,6 +216,9 @@ Content + + Content + Content diff --git a/assets/adhoc-servers.json b/assets/adhoc-servers.json new file mode 100644 index 0000000000..40cc360cf3 --- /dev/null +++ b/assets/adhoc-servers.json @@ -0,0 +1,103 @@ +{ + "servers": [ + { + "name": "Socom Adhoc Server", + "host": "socom.cc", + "discord": "https://discord.com/invite/XtVYDr7", + "web": "", + "location": "France", + "description": "For players looking to play any games", + "data_mode": "AemuPostoffice" + }, + { + "name": "Madness Gaming Network", + "host": "psp.mgn.pub", + "discord": "https://discord.com/invite/kaPScVrPes", + "web": "", + "location": "Alaska USA", + "description": "For players looking to play any games, has a good amount of Monster Hunter players, also provides VPN to work around connection issues as well as P2P mode", + "data_mode": "AemuPostoffice" + }, + { + "name": "EA Nation Hub", + "host": "eahub.eu", + "discord": "https://discord.com/invite/fwrQHHxrQQ", + "web": "", + "location": "France", + "description": "Mostly for Medal of Honor Heros 2 & Need For Speed Most Wanted players, but can be used for other games", + "data_mode": "AemuPostoffice" + }, + { + "name": "Psi-Hate", + "host": "psi-hate.com", + "discord": "https://discord.com/invite/wxeGVkM", + "web": "", + "location": "Minnesota USA", + "description": "For players looking to play any games", + "data_mode": "AemuPostoffice" + }, + { + "name": "Relay Brasileiro", + "host": "jpa36a7.glddns.com", + "discord": "https://discord.com/invite/gp45nhdjQJ", + "web": "", + "location": "São Paulo Brazil", + "description": "For players looking to play any games", + "data_mode": "AemuPostoffice" + }, + { + "name": "ArenaAnywhere SA", + "host": "relay-sa.arenaanywhere.site", + "discord": "https://discord.gg/GdsXWmNHq5", + "web": "", + "location": "South Africa", + "description": "For players looking to play any games", + "data_mode": "AemuPostoffice" + }, + { + "name": "ArenaAnywhere EU", + "host": "relay.arenaanywhere.site", + "discord": "https://discord.gg/GdsXWmNHq5", + "web": "", + "location": "Europe", + "description": "For players looking to play any games", + "data_mode": "AemuPostoffice" + }, + { + "name": "ArenaAnywhere Dubai", + "host": "relay-dubai.arenaanywhere.site", + "discord": "https://discord.gg/GdsXWmNHq5", + "web": "", + "location": "Dubai", + "description": "For players looking to play any games", + "data_mode": "AemuPostoffice" + }, + { + "name": "Retroverze Relay Beta", + "host": "psp.retroverze.my.id", + "discord": "", + "web": "https://retroverze.my.id/beta", + "location": "Unknown", + "description": "For players looking to play any games", + "data_mode": "AemuPostoffice" + }, + { + "name": "Games Nexus", + "host": "adhoc.gamesnexus.ovh", + "discord": "", + "web": "https://adhoc.gamesnexus.ovh", + "location": "Milan Italy", + "description": "For players looking to play any games", + "data_mode": "AemuPostoffice" + }, + { + "name": "Sony PSP & PSVita Fans", + "host": "psp.gameplayer.club", + "discord": "", + "web": "https://psp.gameplayer.club/", + "location": "Unknown", + "description": "For players looking to play any games", + "data_mode": "P2P" + } + ] +}