v3.1.6: Admin-Freischaltung per Geräte-Schlüssel und Code (ohne Konto-Dienst), Y löst gezielt den MBMNET-Platz
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
39ed683c95
commit
7d49f1f342
+26
-9
@@ -351,8 +351,6 @@ static void maintenance_worker(void *arg)
|
||||
char ignore[96];
|
||||
// 1. Patches auffrischen (Miiverse-CA aus dem Zwischenspeicher; nur beim allerersten Mal vom Server)
|
||||
bool hadCa = olvpatch_ca_cached();
|
||||
// 0. Admin? Zuerst, damit die Werkzeuge nicht vom Rest abhängen (act ist hier noch frei)
|
||||
if (!switchRequested) admin_check();
|
||||
patch_progress = maint_step;
|
||||
maint_step("Patches");
|
||||
refresh_patches();
|
||||
@@ -559,17 +557,28 @@ static bool run(int action, char *msg, size_t msglen)
|
||||
case BTN_DISABLE: return disable(confirmed, msg, msglen);
|
||||
case BTN_DIAG: patch_diagnose(msg, msglen); return false;
|
||||
case BTN_UNLINK: {
|
||||
// Verknüpfte NNID nur auf dem 3DS lösen (ohne Server) - z. B. wenn das Konto gelöscht wurde
|
||||
// Verknüpfte ID nur auf dem 3DS lösen (ohne Server). Bei aktivem MBMNET gezielt den MBMNET-Platz -
|
||||
// nicht den, auf dem act gerade steht (der war nach einem Soft-Reboot manchmal noch der Pretendo-Platz).
|
||||
char id[20];
|
||||
if (!nnid_linked(id, sizeof(id))) { snprintf(msg, msglen, "Hier ist keine ID verknüpft."); return false; }
|
||||
bool mbmnet = patch_state() == STATE_MBMNET && frdswitch_current() == FRIEND_ACCOUNT_MBMNET;
|
||||
u8 slot = mbmnet ? frdswitch_slot_of(FRIEND_ACCOUNT_MBMNET) : 0;
|
||||
bool linked = slot ? frdswitch_slot_linked(FRIEND_ACCOUNT_MBMNET, id, sizeof(id)) : nnid_linked(id, sizeof(id));
|
||||
if (!linked) { snprintf(msg, msglen, "Hier ist keine ID verknüpft."); return false; }
|
||||
if (!confirmed) {
|
||||
armed = BTN_UNLINK;
|
||||
snprintf(msg, msglen, "\"%s\" vom 3DS lösen?\nNur auf dem 3DS, das Konto selbst bleibt unberührt.\n"
|
||||
"Zum Bestätigen nochmal Y drücken.", id);
|
||||
snprintf(msg, msglen, "\"%s\"%s vom 3DS lösen?\nNur auf dem 3DS, das Konto selbst bleibt unberührt.\n"
|
||||
"Zum Bestätigen nochmal Y drücken.", id, slot ? " (MBMNET-Platz)" : "");
|
||||
return false;
|
||||
}
|
||||
if (!nnid_unlink(msg, msglen)) return false;
|
||||
snprintf(msg, msglen, "\"%s\" gelöst. Der 3DS startet neu.\nDanach kannst du eine andere ID verknüpfen.", id);
|
||||
if (slot ? !nnid_unlink_slot(slot, msg, msglen) : !nnid_unlink(msg, msglen)) return false;
|
||||
if (slot) {
|
||||
char hint[160];
|
||||
remember_mbmnet_id(id);
|
||||
link_hint(hint, sizeof(hint));
|
||||
snprintf(msg, msglen, "\"%s\" gelöst. Der 3DS startet neu.\nDanach neu verknüpfen:\n%s", id, hint);
|
||||
} else {
|
||||
snprintf(msg, msglen, "\"%s\" gelöst. Der 3DS startet neu.\nDanach kannst du eine andere ID verknüpfen.", id);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case BTN_FTP:
|
||||
@@ -656,6 +665,7 @@ int main(int argc, char **argv)
|
||||
u8 mslot = frdswitch_slot_of(FRIEND_ACCOUNT_MBMNET);
|
||||
admin_prepare(server, st == STATE_MBMNET && frdswitch_current() == FRIEND_ACCOUNT_MBMNET && mslot
|
||||
&& frdswitch_slot_linked(FRIEND_ACCOUNT_MBMNET, mid, sizeof(mid)), mslot);
|
||||
admin_check_async(); // Freigabe der Konsole beim Server erfragen (Hintergrund)
|
||||
}
|
||||
// Ein SpotPass-Test von früher (App mitten im Test verlassen) darf nicht weiterlaufen
|
||||
spotpass_test_cancel();
|
||||
@@ -685,6 +695,7 @@ int main(int argc, char **argv)
|
||||
|
||||
int selected = st == STATE_MBMNET ? BTN_DISABLE : BTN_ENABLE;
|
||||
bool toolsToggled = false;
|
||||
bool showWhy = false; // Meldung zur Freischaltung der Werkzeuge anzeigen (nach SELECT)
|
||||
int queued = -1; // Aktion, die nach dem nächsten Bild läuft (damit sofort etwas passiert)
|
||||
|
||||
while (aptMainLoop()) {
|
||||
@@ -699,7 +710,13 @@ int main(int argc, char **argv)
|
||||
}
|
||||
bool wasTools = toolsToggled;
|
||||
if (down & KEY_SELECT && admin_is()) toolsToggled = !toolsToggled;
|
||||
else if (down & KEY_SELECT) snprintf(msg, sizeof(msg), "%s\n(Auffrischen: %s)", admin_why(), maintStep);
|
||||
else if (down & KEY_SELECT) {
|
||||
admin_check_async(); // nach dem Freischalten auf der Webseite: gleich nochmal fragen
|
||||
showWhy = true;
|
||||
}
|
||||
// Stand der Freischaltung live anzeigen, bis etwas anderes passiert
|
||||
if (showWhy && (admin_is() || down & (KEY_A | KEY_B | KEY_Y | KEY_TOUCH))) { showWhy = false; if (admin_is()) msg[0] = 0; }
|
||||
if (showWhy) snprintf(msg, sizeof(msg), "%s", admin_why());
|
||||
if (down & KEY_B && toolsToggled) toolsToggled = false;
|
||||
if (!admin_is()) toolsToggled = false; // Werkzeuge nur für Admins (Server hat es bestätigt)
|
||||
// Werkzeuge nur mit SELECT, beim Öffnen immer aus
|
||||
|
||||
Reference in New Issue
Block a user