v2.9.4: einmalige Umstellung auf den Zweitnamen (MBMNET-ID unter echtem Namen wird für Pretendo gelöst)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
8e69fbaac2
commit
52e0270c80
@@ -17,7 +17,7 @@ SOURCES := source
|
||||
INCLUDES := source
|
||||
|
||||
# Bei jedem Release erhöhen - das Auto-Update vergleicht diese Nummer
|
||||
VERSION := 2.9.3
|
||||
VERSION := 2.9.4
|
||||
|
||||
APP_TITLE := MBMNET
|
||||
APP_DESCRIPTION := Dein eigenes 3DS-Netzwerk
|
||||
|
||||
+32
-2
@@ -6,6 +6,8 @@
|
||||
#include <citro2d.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include "patcher.h"
|
||||
#include "update.h"
|
||||
@@ -394,14 +396,40 @@ static bool enable(bool confirmed, char *msg, size_t msglen)
|
||||
return true;
|
||||
}
|
||||
|
||||
// Umstellung auf den Zweitnamen (einmalig): Steht im MBMNET-Platz noch die ID unter dem echten Namen, blockiert
|
||||
// sie eine gleichnamige Pretendo-ID (022-2571). Dann wird sie EINMAL gelöst; beim nächsten Wechsel zu MBMNET
|
||||
// meldet man sich mit "<Name>.m" an, und ab dann bleibt alles verknüpft. note bekommt den Hinweis.
|
||||
#define ALIAS_DONE_MARKER "sdmc:/3ds/mbmnet/zweitname-umgestellt"
|
||||
static bool free_mbmnet_name(char *note, size_t len)
|
||||
{
|
||||
note[0] = 0;
|
||||
FILE *m = fopen(ALIAS_DONE_MARKER, "r");
|
||||
if (m) { fclose(m); return false; }
|
||||
char id[20];
|
||||
u8 slot = frdswitch_slot_of(FRIEND_ACCOUNT_MBMNET);
|
||||
if (!slot || !frdswitch_slot_linked(FRIEND_ACCOUNT_MBMNET, id, sizeof(id))) return false;
|
||||
size_t n = strlen(id);
|
||||
if (n >= 2 && !strcasecmp(id + n - 2, ".m")) return false; // schon der Zweitname
|
||||
remember_mbmnet_id(id);
|
||||
if (!nnid_unlink_slot(slot, note, len)) return false;
|
||||
mkdir("sdmc:/3ds/mbmnet", 0777);
|
||||
m = fopen(ALIAS_DONE_MARKER, "w");
|
||||
if (m) { fputs(id, m); fclose(m); }
|
||||
snprintf(note, len, "\"%s\" ist jetzt frei für Pretendo.\nZurück bei MBMNET einmal mit \"%.14s.m\" anmelden,\ndanach nie wieder.", id, id);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Zurück zu Nintendo. true = der 3DS muss jetzt neu starten.
|
||||
static bool disable(bool confirmed, char *msg, size_t msglen)
|
||||
{
|
||||
(void)confirmed;
|
||||
char detail[160] = "";
|
||||
PatchState st = patch_state();
|
||||
char note[200];
|
||||
if (st == STATE_ORIGINAL && frdswitch_current() == FRIEND_ACCOUNT_NINTENDO) {
|
||||
snprintf(msg, msglen, "Nintendo ist schon aktiv.");
|
||||
if (free_mbmnet_name(note, sizeof(note))) snprintf(msg, msglen, "Nintendo ist schon aktiv.\n%s", note);
|
||||
else if (note[0]) snprintf(msg, msglen, "%s", note);
|
||||
else snprintf(msg, msglen, "Nintendo ist schon aktiv.");
|
||||
return false;
|
||||
}
|
||||
if (st == STATE_FOREIGN) {
|
||||
@@ -412,11 +440,13 @@ static bool disable(bool confirmed, char *msg, size_t msglen)
|
||||
// anmelden). Den Namen merken, für den Hinweis auf den Zweitnamen.
|
||||
char id[20] = "";
|
||||
if (frdswitch_current() == FRIEND_ACCOUNT_MBMNET && nnid_linked(id, sizeof(id))) remember_mbmnet_id(id);
|
||||
bool freed = free_mbmnet_name(note, sizeof(note));
|
||||
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();
|
||||
snprintf(msg, msglen, "Nintendo aktiv! Der 3DS startet neu.\nDeine Nintendo-Freundesliste ist wieder da.");
|
||||
if (freed) snprintf(msg, msglen, "Nintendo aktiv! Der 3DS startet neu.\n%s", note);
|
||||
else snprintf(msg, msglen, "Nintendo aktiv! Der 3DS startet neu.\nDeine Nintendo-Freundesliste ist wieder da.");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -193,6 +193,25 @@ bool nnid_name_elsewhere(const char *name, u8 exceptSlot)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool nnid_unlink_slot(u8 slot, char *msg, size_t msglen)
|
||||
{
|
||||
if (!ready) return false;
|
||||
AccountId id = { 0 };
|
||||
ACT_GetAccountInfo(id, sizeof(id), slot, INFO_TYPE_ACCOUNT_ID);
|
||||
if (!id[0]) return true;
|
||||
FILE *log = fopen(LOG_FILE, "a");
|
||||
Result rc = ACTA_UnbindServerAccount(slot, true);
|
||||
if (log) fprintf(log, "Platz %u (%s) lösen %08lX\n", slot, id, (unsigned long)rc);
|
||||
if (R_FAILED(rc)) {
|
||||
Result u = ACTA_UnloadConsoleAccount();
|
||||
rc = ACTA_UnbindServerAccount(slot, true);
|
||||
if (log) fprintf(log, " nach Abmelden (%08lX): %08lX\n", (unsigned long)u, (unsigned long)rc);
|
||||
}
|
||||
if (log) fclose(log);
|
||||
if (R_FAILED(rc)) snprintf(msg, msglen, "\"%s\" (Platz %u) ließ sich nicht lösen (Fehler %08lX).", id, slot, (unsigned long)rc);
|
||||
return R_SUCCEEDED(rc);
|
||||
}
|
||||
|
||||
// Löst die ID "name" in allen Konto-Plätzen außer exceptSlot (nur auf dem 3DS). false + msg bei Fehler.
|
||||
bool nnid_unlink_named(const char *name, u8 exceptSlot, char *msg, size_t msglen)
|
||||
{
|
||||
|
||||
@@ -18,6 +18,8 @@ bool nnid_unlink(char *msg, size_t msglen);
|
||||
// Gibt es die ID "name" in einem Konto-Platz außer exceptSlot?
|
||||
bool nnid_name_elsewhere(const char *name, u8 exceptSlot);
|
||||
// Löst die ID "name" in allen Konto-Plätzen außer exceptSlot (nur auf dem 3DS)
|
||||
// Löst die ID in einem bestimmten Konto-Platz (nur auf dem 3DS). false + msg bei Fehler.
|
||||
bool nnid_unlink_slot(u8 slot, char *msg, size_t msglen);
|
||||
bool nnid_unlink_named(const char *name, u8 exceptSlot, char *msg, size_t msglen);
|
||||
// Schreibt alle Konto-Plätze in die Diagnose
|
||||
void nnid_dump(FILE *f);
|
||||
|
||||
Reference in New Issue
Block a user