fix: prevent sync spam
This commit is contained in:
@@ -40,11 +40,9 @@ export const useWebsocketStore = create<WebsocketState>((set, get) => ({
|
||||
try {
|
||||
const payload = JSON.parse(msg.data);
|
||||
|
||||
// C++ sends action=0 (INIT_CONFIG) on WebSocket open
|
||||
if (payload.action === 0) {
|
||||
const mapped = await mapSpooferConfigToStore(payload.profile);
|
||||
|
||||
// Snapshot current state strings to prevent echo
|
||||
lastInventoryJson = JSON.stringify({
|
||||
unlockedCharacters: mapped.unlockedCharacters,
|
||||
unlockedCustomizations: mapped.unlockedCustomizations,
|
||||
@@ -71,12 +69,15 @@ export const useWebsocketStore = create<WebsocketState>((set, get) => ({
|
||||
}
|
||||
}));
|
||||
|
||||
// Subscribe to store changes and sync to C++ client
|
||||
let syncTimeout: any = null;
|
||||
|
||||
useInventoryStore.subscribe((state) => {
|
||||
if (syncTimeout) clearTimeout(syncTimeout);
|
||||
|
||||
syncTimeout = setTimeout(() => {
|
||||
const { socket, isConnected } = useWebsocketStore.getState();
|
||||
if (!isConnected || !socket || socket.readyState !== WebSocket.OPEN) return;
|
||||
|
||||
// --- Check toggles ---
|
||||
const toggles = {
|
||||
spoofItems: state.spoofItems,
|
||||
spoofPerks: state.spoofPerks,
|
||||
@@ -89,7 +90,6 @@ useInventoryStore.subscribe((state) => {
|
||||
socket.send(JSON.stringify({ action: 2, toggles }));
|
||||
}
|
||||
|
||||
// --- Check inventory ---
|
||||
const inventory = {
|
||||
unlockedCharacters: state.unlockedCharacters,
|
||||
unlockedCustomizations: state.unlockedCustomizations,
|
||||
@@ -104,15 +104,14 @@ useInventoryStore.subscribe((state) => {
|
||||
lastInventoryJson = inventoryJson;
|
||||
|
||||
mapStoreToSpooferConfig(state).then((profile) => {
|
||||
// Re-check connection in case it dropped during async mapping
|
||||
const ws = useWebsocketStore.getState();
|
||||
if (
|
||||
ws.isConnected &&
|
||||
ws.socket &&
|
||||
ws.socket.readyState === WebSocket.OPEN
|
||||
) {
|
||||
)
|
||||
ws.socket.send(JSON.stringify({ action: 1, profile }));
|
||||
}
|
||||
});
|
||||
}
|
||||
}, 250);
|
||||
});
|
||||
|
||||
@@ -59,7 +59,6 @@ export async function mapStoreToSpooferConfig(state: {
|
||||
const perkMap = new Map<string, { role: number }>();
|
||||
allPerks.forEach((p: { id: string; role: number }) => perkMap.set(p.id, p));
|
||||
|
||||
// --- DLCs ---
|
||||
const dlcListSteam: string[] = [];
|
||||
const dlcListEGS: string[] = [];
|
||||
const dlcListGRDK: string[] = [];
|
||||
@@ -87,13 +86,11 @@ export async function mapStoreToSpooferConfig(state: {
|
||||
dlcListGRDK.push(dlc.dlcIds.grdk);
|
||||
}
|
||||
|
||||
// --- Items ---
|
||||
const camperItems: Record<string, number> = {};
|
||||
for (const [id, qty] of Object.entries(state.items)) {
|
||||
if (qty > 0 && itemIdSet.has(id)) camperItems[id] = qty;
|
||||
}
|
||||
|
||||
// --- Offerings ---
|
||||
const camperOfferings: Record<string, number> = {};
|
||||
const slasherOfferings: Record<string, number> = {};
|
||||
const globalOfferings: Record<string, number> = {};
|
||||
@@ -107,7 +104,6 @@ export async function mapStoreToSpooferConfig(state: {
|
||||
else globalOfferings[id] = qty;
|
||||
}
|
||||
|
||||
// --- Addons ---
|
||||
const camperAddons: Record<string, number> = {};
|
||||
const slasherAddons: Record<string, number> = {};
|
||||
|
||||
@@ -119,7 +115,6 @@ export async function mapStoreToSpooferConfig(state: {
|
||||
else camperAddons[id] = qty;
|
||||
}
|
||||
|
||||
// --- Perks ---
|
||||
const camperPerks: string[] = [];
|
||||
const slasherPerks: string[] = [];
|
||||
|
||||
|
||||
Reference in New Issue
Block a user