From 9538160ab21dfed93e5b199f4ace3543e75dfbed Mon Sep 17 00:00:00 2001 From: Nico Meister Date: Sun, 18 Oct 2026 18:53:27 +0200 Subject: [PATCH] =?UTF-8?q?v2.9.3:=20IDs=20bleiben=20beim=20Umschalten=20v?= =?UTF-8?q?erkn=C3=BCpft=20(Zweitname),=20Mii-Abgleich=20mit=20dem=20Serve?= =?UTF-8?q?r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- Makefile | 2 +- source/main.c | 73 +++++++++++++++++++++++++++------------------------ 2 files changed, 39 insertions(+), 36 deletions(-) diff --git a/Makefile b/Makefile index 3d789aa..a8a817c 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ SOURCES := source INCLUDES := source # Bei jedem Release erhöhen - das Auto-Update vergleicht diese Nummer -VERSION := 2.9.2 +VERSION := 2.9.3 APP_TITLE := MBMNET APP_DESCRIPTION := Dein eigenes 3DS-Netzwerk diff --git a/source/main.c b/source/main.c index c92dc31..2cf92f3 100644 --- a/source/main.c +++ b/source/main.c @@ -280,6 +280,16 @@ static void maintenance_worker(void *arg) (void)arg; char ignore[96], detail[160]; spotpass_register(MBMNET_SERVER, ignore, sizeof(ignore)); + // Konto mit dem MBMNET-Server abgleichen: holt u. a. den Mii, den man auf der Webseite eingestellt hat + u8 slot = frdswitch_slot_of(FRIEND_ACCOUNT_MBMNET); + char id[20]; + if (slot && frdswitch_slot_linked(FRIEND_ACCOUNT_MBMNET, id, sizeof(id))) { + Handle done; + if (R_SUCCEEDED(svcCreateEvent(&done, RESET_ONESHOT))) { + if (R_SUCCEEDED(ACTA_SyncAccountInfo(slot, done))) svcWaitSynchronization(done, 15ULL * 1000 * 1000 * 1000); + svcCloseHandle(done); + } + } bool changed = false; // Patches auffrischen: neue Versionen bringen neue Ziele mit (z. B. Miiverse ab v2.8.0) if (patch_enable(MBMNET_SERVER, &changed, detail, sizeof(detail)) && changed) maintenanceChanged = true; @@ -306,6 +316,21 @@ static void remembered_mbmnet_id(char *out, size_t len) fclose(f); } +// Wie man den MBMNET-Platz verknüpft. Heißt die MBMNET-ID wie eine Nintendo- oder Pretendo-ID, die schon in +// einem anderen Platz steht, lässt der 3DS sie dort nicht zu (022-2571) - dann den Zweitnamen ".m" +// nehmen (kennt der MBMNET-Server). So bleiben alle IDs verknüpft und man muss sich nie neu anmelden. +static void link_hint(char *out, size_t len) +{ + char name[20] = ""; + remembered_mbmnet_id(name, sizeof(name)); + if (!name[0]) frdswitch_slot_linked(FRIEND_ACCOUNT_NINTENDO, name, sizeof(name)); + if (!name[0]) frdswitch_slot_linked(2, name, sizeof(name)); // Pretendo (Nimbus) + if (name[0]) + snprintf(out, len, "Einstellungen > Nintendo Network ID > Vorhandene ID.\nHeißt sie wie \"%s\": mit \"%.14s.m\" anmelden.", name, name); + else + snprintf(out, len, "Einstellungen > Nintendo Network ID > Vorhandene ID.\nGleicher Name wie bei Pretendo? Dann Name + \".m\"."); +} + // Umschalten auf MBMNET. true = der 3DS muss jetzt neu starten. static bool enable(bool confirmed, char *msg, size_t msglen) { @@ -327,25 +352,16 @@ static bool enable(bool confirmed, char *msg, size_t msglen) return true; } bool linked = frdswitch_slot_linked(FRIEND_ACCOUNT_MBMNET, id, sizeof(id)); - snprintf(msg, msglen, linked ? "MBMNET ist schon aktiv (Konto %s)." : "MBMNET ist schon aktiv.\n" - "Jetzt dein MBMNET-Konto verknüpfen:\nEinstellungen > Nintendo Network ID", id); + if (linked) { snprintf(msg, msglen, "MBMNET ist schon aktiv (Konto %s).", id); return false; } + char hint[160]; + link_hint(hint, sizeof(hint)); + snprintf(msg, msglen, "MBMNET ist schon aktiv. Jetzt einmal verknüpfen:\n%s", hint); return false; } // Umstieg von älteren Versionen: Dort steckte die MBMNET-ID im Nintendo-Platz. Sie muss dort raus, // sonst lässt sie sich im eigenen MBMNET-Platz nicht verknüpfen (Fehler 022-2571). bool migrate = old_mbmnet_link() && frdswitch_slot_linked(FRIEND_ACCOUNT_NINTENDO, id, sizeof(id)); - // Die gemerkte MBMNET-ID steckt noch in einem anderen Platz (z. B. Pretendo mit gleichem Namen)? - char mbmnetId[20]; - remembered_mbmnet_id(mbmnetId, sizeof(mbmnetId)); - u8 mbmnetSlot = frdswitch_slot_of(FRIEND_ACCOUNT_MBMNET); - bool sameNameElsewhere = !migrate && mbmnetId[0] && nnid_name_elsewhere(mbmnetId, mbmnetSlot); - if (sameNameElsewhere && !confirmed) { - armed = BTN_ENABLE; - snprintf(msg, msglen, "\"%s\" ist noch in einem anderen Platz verknüpft (z. B. Pretendo).\n" - "Der 3DS erlaubt sie nur einmal: Sie wird dort gelöst, damit du sie\nbei MBMNET verknüpfen kannst. Zum Bestätigen nochmal antippen.", mbmnetId); - return false; - } if (migrate && !confirmed) { armed = BTN_ENABLE; snprintf(msg, msglen, "Umstellung auf ein eigenes MBMNET-Freundekonto:\n\"%s\" wird aus dem Nintendo-Platz gelöst\n" @@ -360,11 +376,6 @@ static bool enable(bool confirmed, char *msg, size_t msglen) } if (migrate && !nnid_unlink(msg, msglen)) return false; remove(UNLINKED_MARKER); - if (sameNameElsewhere && !nnid_unlink_named(mbmnetId, mbmnetSlot, msg, msglen)) { - char ignore[160]; - patch_disable(ignore, sizeof(ignore)); - return false; - } bool created = false; if (!frdswitch_to(FRIEND_ACCOUNT_MBMNET, &created, msg, msglen)) { @@ -375,10 +386,11 @@ static bool enable(bool confirmed, char *msg, size_t msglen) bool linked = frdswitch_slot_linked(FRIEND_ACCOUNT_MBMNET, id, sizeof(id)); char ignore[96]; spotpass_register(MBMNET_SERVER, ignore, sizeof(ignore)); // Mitteilungen per SpotPass - snprintf(msg, msglen, "MBMNET aktiv! Der 3DS startet neu.\n%s", - created ? "Eigenes MBMNET-Freundekonto angelegt. Danach einmal:\nEinstellungen > Nintendo Network ID > Vorhandene ID" - : linked ? "Deine MBMNET-Anmeldung und -Freundesliste sind wieder da." - : "Danach einmal: Einstellungen > Nintendo Network ID"); + char hint[160]; + link_hint(hint, sizeof(hint)); + if (linked) snprintf(msg, msglen, "MBMNET aktiv! Der 3DS startet neu.\nDeine MBMNET-Anmeldung und -Freundesliste sind wieder da."); + else snprintf(msg, msglen, "MBMNET aktiv! Der 3DS startet neu.\n%sDanach einmal (nur dieses eine Mal):\n%.120s", + created ? "Eigenes MBMNET-Freundekonto angelegt. " : "", hint); return true; } @@ -396,24 +408,15 @@ static bool disable(bool confirmed, char *msg, size_t msglen) snprintf(msg, msglen, "MBMNET ist nicht aktiv (anderer Patch)."); return false; } - // MBMNET-ID aus dem MBMNET-Platz lösen und merken: Heißt die Pretendo-ID genauso, ließe sie sich sonst - // im Pretendo-Platz nicht verknüpfen (022-2571). Beim Wechsel zurück zu MBMNET neu anmelden. + // Die MBMNET-ID bleibt verknüpft (früher wurde sie hier gelöst, dann musste man sich jedes Mal neu + // anmelden). Den Namen merken, für den Hinweis auf den Zweitnamen. char id[20] = ""; - bool unlinked = false; - if (frdswitch_current() == FRIEND_ACCOUNT_MBMNET && nnid_linked(id, sizeof(id))) { - remember_mbmnet_id(id); - if (!nnid_unlink(msg, msglen)) return false; - unlinked = true; - } + if (frdswitch_current() == FRIEND_ACCOUNT_MBMNET && nnid_linked(id, sizeof(id))) remember_mbmnet_id(id); bool created = false; if (frdswitch_current() != FRIEND_ACCOUNT_NINTENDO && !frdswitch_to(FRIEND_ACCOUNT_NINTENDO, &created, msg, msglen)) return false; patch_disable(detail, sizeof(detail)); spotpass_unregister(); - if (unlinked) - snprintf(msg, msglen, "Nintendo aktiv! Der 3DS startet neu.\n\"%s\" wurde vom MBMNET-Platz gelöst (für Pretendo).\n" - "Zurück zu MBMNET: danach einmal neu anmelden.", id); - else - snprintf(msg, msglen, "Nintendo aktiv! Der 3DS startet neu.\nDeine Nintendo-Freundesliste ist wieder da."); + snprintf(msg, msglen, "Nintendo aktiv! Der 3DS startet neu.\nDeine Nintendo-Freundesliste ist wieder da."); return true; }