第57批续17: Java拉取PHP邮箱回推队列写权威db——pullEmailBindings()幂等写db+触发syncUserRegistrations收敛,挂TimerA
This commit is contained in:
@@ -2804,6 +2804,11 @@ public class WebManager {
|
|||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
plugin.getLogger().warning("[合并A-网页绑邮箱] 异常: " + e.getClass().getSimpleName() + " - " + e.getMessage());
|
plugin.getLogger().warning("[合并A-网页绑邮箱] 异常: " + e.getClass().getSimpleName() + " - " + e.getMessage());
|
||||||
}
|
}
|
||||||
|
// ★ 第57批续17:拉取PHP邮箱回推队列(权威权交还Java)→写db后既有sync收敛
|
||||||
|
try { pullEmailBindings(); }
|
||||||
|
catch (Exception e) {
|
||||||
|
plugin.getLogger().warning("[合并A-邮箱回推拉取] 异常: " + e.getClass().getSimpleName() + " - " + e.getMessage());
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// ★ 定期同步在线玩家(保持PHP心跳,全员下线时也推送空列表)
|
// ★ 定期同步在线玩家(保持PHP心跳,全员下线时也推送空列表)
|
||||||
@@ -12385,6 +12390,73 @@ public class WebManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ==================== 第57批续17:拉取PHP邮箱回推队列(权威权交还Java) ====================
|
||||||
|
/**
|
||||||
|
* 拉取 PHP 侧「邮箱绑定验证通过」回推队列(pull_email_bindings),
|
||||||
|
* 由 Java 统一写权威 db(users.email),再经既有 syncUserRegistrations 收敛 PHP 镜像。
|
||||||
|
* 幂等:已一致的邮箱不重复写;拉取后若 Java 宕机,PHP 队列已置 pending=0,
|
||||||
|
* 由一次性对账脚本重新投递兜底。
|
||||||
|
*/
|
||||||
|
private void pullEmailBindings() {
|
||||||
|
try {
|
||||||
|
String urlStr = webBaseUrl + "/api/sync.php?action=pull_email_bindings&secret="
|
||||||
|
+ java.net.URLEncoder.encode(secretKey, "UTF-8");
|
||||||
|
String json = doGet(urlStr);
|
||||||
|
if (json == null || json.contains("database is locked")) return;
|
||||||
|
if (!json.contains("\"success\":true")) return;
|
||||||
|
int countStart = json.indexOf("\"count\":");
|
||||||
|
if (countStart < 0) return;
|
||||||
|
int cvStart = countStart + 8;
|
||||||
|
int cvEnd = cvStart;
|
||||||
|
while (cvEnd < json.length() && Character.isDigit(json.charAt(cvEnd))) cvEnd++;
|
||||||
|
if (cvEnd == cvStart) return;
|
||||||
|
int count = Integer.parseInt(json.substring(cvStart, cvEnd));
|
||||||
|
if (count == 0) return;
|
||||||
|
int arrStart = json.indexOf("\"bindings\":[");
|
||||||
|
if (arrStart < 0) return;
|
||||||
|
arrStart += 12;
|
||||||
|
int arrEnd = findMatchingBracket(json, arrStart - 1);
|
||||||
|
if (arrEnd < 0) return;
|
||||||
|
String arrStr = json.substring(arrStart, arrEnd);
|
||||||
|
int idx = 0;
|
||||||
|
final java.util.concurrent.atomic.AtomicInteger applied = new java.util.concurrent.atomic.AtomicInteger(0);
|
||||||
|
while (idx < arrStr.length()) {
|
||||||
|
int objStart = arrStr.indexOf('{', idx);
|
||||||
|
if (objStart == -1) break;
|
||||||
|
int objEnd = arrStr.indexOf('}', objStart);
|
||||||
|
if (objEnd == -1) break;
|
||||||
|
String item = arrStr.substring(objStart, objEnd + 1);
|
||||||
|
idx = objEnd + 1;
|
||||||
|
final String playerName = extractJsonString(item, "player_name");
|
||||||
|
final String emailAddr = extractJsonString(item, "email");
|
||||||
|
if (playerName == null || emailAddr == null || emailAddr.isEmpty()) continue;
|
||||||
|
final String fEmail = emailAddr;
|
||||||
|
final String fPlayer = playerName;
|
||||||
|
submitDbTask("邮箱回推写db", () -> {
|
||||||
|
try {
|
||||||
|
DatabaseManager dbMgr = plugin.getDb();
|
||||||
|
if (dbMgr == null) return;
|
||||||
|
Object cur = dbMgr.getField(fPlayer, "email");
|
||||||
|
String curEmail = cur == null ? "" : String.valueOf(cur).trim();
|
||||||
|
if (fEmail.equals(curEmail)) return; // 已一致,幂等跳过
|
||||||
|
if (!dbMgr.userExists(fPlayer)) dbMgr.createUser(fPlayer, "", "");
|
||||||
|
dbMgr.setField(fPlayer, "email", fEmail);
|
||||||
|
applied.incrementAndGet();
|
||||||
|
plugin.getLogger().info("[邮箱回推] 已写Java权威db: " + fPlayer + " -> " + fEmail);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
plugin.getLogger().warning("[邮箱回推] 写db异常: " + ex.getMessage());
|
||||||
|
}
|
||||||
|
}, true);
|
||||||
|
}
|
||||||
|
if (applied.get() > 0) {
|
||||||
|
// 触发既有收敛:把 Java 权威值写回 PHP users.email(单向 Java→PHP 镜像)
|
||||||
|
submitDbTask("邮箱回推收敛", () -> syncUserRegistrations());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
plugin.getLogger().warning("[邮箱回推拉取] 异常: " + e.getClass().getSimpleName() + " - " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
||||||
* 将游戏内批准/拒绝结果回传PHP(callback 可为 null,回调回主线程执行)。
|
* 将游戏内批准/拒绝结果回传PHP(callback 可为 null,回调回主线程执行)。
|
||||||
|
|||||||
Reference in New Issue
Block a user