Skip to content

Commit f6c1deb

Browse files
committed
Updated Server
1 parent 2563fe7 commit f6c1deb

File tree

2 files changed

+44
-31
lines changed

2 files changed

+44
-31
lines changed

ai/storage.js

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
document.addEventListener("DOMContentLoaded", () => {
22
const SERVER_URL = "https://vps.unityailab.online:3000";
3-
const USE_LOCAL_FALLBACK = true;
3+
const USE_LOCAL_FALLBACK = false; // Set to false for live server interaction
44

55
const sessionListEl = document.getElementById("session-list");
66
let sessions = loadSessions();
@@ -258,6 +258,14 @@ document.addEventListener("DOMContentLoaded", () => {
258258
}
259259
checkOrGenerateUserId().then(() => {
260260
console.log("User ID validation complete");
261+
// Force registration every load
262+
const userId = localStorage.getItem("uniqueUserId");
263+
if (userId) {
264+
registerUserIdWithServer(userId).catch(err => {
265+
console.warn("Server registration failed:", err);
266+
ensureLocalUserId();
267+
});
268+
}
261269
}).catch(err => {
262270
console.warn("Problem with user ID, using local fallback:", err);
263271
ensureLocalUserId();
@@ -276,19 +284,9 @@ document.addEventListener("DOMContentLoaded", () => {
276284
let userId = localStorage.getItem("uniqueUserId");
277285
if (!userId) {
278286
userId = generateRandomId();
279-
let success = false;
280-
if (!USE_LOCAL_FALLBACK) {
281-
try {
282-
success = await registerUserIdWithServer(userId);
283-
} catch (err) {
284-
console.warn("Server registration failed, using local fallback:", err);
285-
success = true;
286-
}
287-
} else {
288-
success = true;
289-
}
290287
localStorage.setItem("uniqueUserId", userId);
291288
}
289+
await registerUserIdWithServer(userId); // Always register on load
292290
return userId;
293291
}
294292

@@ -298,32 +296,33 @@ document.addEventListener("DOMContentLoaded", () => {
298296
await new Promise(resolve => setTimeout(resolve, 100));
299297
return true;
300298
}
299+
const storedToken = localStorage.getItem("userToken");
301300
try {
302301
const response = await fetch(`${SERVER_URL}/api/registerUser`, {
303302
method: "POST",
304303
headers: { "Content-Type": "application/json" },
305-
body: JSON.stringify({ userId })
304+
body: JSON.stringify({ userId, token: storedToken })
306305
});
307-
if (!response.ok) {
308-
throw new Error(`Server error: ${response.status}`);
309-
}
306+
if (!response.ok) throw new Error(`Server error: ${response.status}`);
310307
const data = await response.json();
308+
if (data.token) localStorage.setItem("userToken", data.token);
311309
return data.status === "registered" || data.status === "exists";
312310
} catch (err) {
313311
console.warn("Server registration failed:", err);
314-
return true;
312+
return false;
315313
}
316314
}
317315

318316
function generateRandomId() {
319-
return Math.random().toString(36).substr(2, 12) + Date.now().toString(36);
317+
// Ensure 18-20 chars, lowercase alphanumeric
318+
return (Math.random().toString(36) + Date.now().toString(36)).substr(2, 20).toLowerCase().replace(/[^a-z0-9]/g, '');
320319
}
321320

322321
function startVisitorCountPolling() {
323322
updateVisitorCount();
324323
setInterval(() => {
325324
updateVisitorCount();
326-
}, 300000);
325+
}, 60000); // 60 seconds
327326
}
328327

329328
async function updateVisitorCount() {
@@ -340,9 +339,7 @@ document.addEventListener("DOMContentLoaded", () => {
340339
signal: controller.signal
341340
});
342341
clearTimeout(timeoutId);
343-
if (!response.ok) {
344-
throw new Error(`Server error: ${response.status}`);
345-
}
342+
if (!response.ok) throw new Error(`Server error: ${response.status}`);
346343
const data = await response.json();
347344
visitorDisplay.textContent = data.count.toLocaleString();
348345
} catch (err) {

server/server.js

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,16 @@ app.use(express.json());
1414
const dataFilePath = path.join(__dirname, "userData.json");
1515

1616
// Load existing user IDs into memory at startup
17-
let userIds = new Set();
17+
let userIds = new Map(); // id -> token
1818
if (fs.existsSync(dataFilePath)) {
1919
try {
2020
const data = JSON.parse(fs.readFileSync(dataFilePath, "utf8"));
2121
if (Array.isArray(data.userIds)) {
22-
userIds = new Set(data.userIds);
22+
// Backward compatibility with old format
23+
data.userIds.forEach(id => userIds.set(id, null));
24+
} else if (data.userIds) {
25+
// New format: { "userIds": { "id1": "token1", "id2": "token2" } }
26+
Object.entries(data.userIds).forEach(([id, token]) => userIds.set(id, token));
2327
}
2428
} catch (err) {
2529
console.error("Error reading userData.json:", err.message);
@@ -29,7 +33,7 @@ if (fs.existsSync(dataFilePath)) {
2933
// Helper to save user IDs to file
3034
function saveUserIdsToFile() {
3135
try {
32-
const data = { userIds: [...userIds] };
36+
const data = { userIds: Object.fromEntries(userIds) };
3337
fs.writeFileSync(dataFilePath, JSON.stringify(data, null, 2));
3438
} catch (err) {
3539
console.error("Error writing to userData.json:", err.message);
@@ -38,11 +42,15 @@ function saveUserIdsToFile() {
3842

3943
// Helper to validate user ID format
4044
function isValidUserId(userId) {
41-
// Must be a string, 18-20 characters, lowercase alphanumeric (a-z, 0-9)
4245
const userIdRegex = /^[a-z0-9]{18,20}$/;
4346
return typeof userId === "string" && userIdRegex.test(userId);
4447
}
4548

49+
// Helper to generate a token
50+
function generateToken() {
51+
return Math.random().toString(36).substr(2, 10);
52+
}
53+
4654
// Middleware for logging requests
4755
app.use((req, res, next) => {
4856
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url} - IP: ${req.ip}`);
@@ -53,7 +61,7 @@ app.use((req, res, next) => {
5361
// REGISTER USER ID
5462
// =======================
5563
app.post("/api/registerUser", (req, res) => {
56-
const { userId } = req.body;
64+
const { userId, token } = req.body;
5765

5866
// Validate request body
5967
if (!userId) {
@@ -67,13 +75,21 @@ app.post("/api/registerUser", (req, res) => {
6775

6876
// Check if userId already exists
6977
if (userIds.has(userId)) {
70-
return res.status(200).json({ status: "exists" });
78+
const storedToken = userIds.get(userId);
79+
if (token && storedToken && token === storedToken) {
80+
return res.status(200).json({ status: "exists" });
81+
} else if (!token && !storedToken) {
82+
// Allow old clients without tokens (backward compatibility)
83+
return res.status(200).json({ status: "exists" });
84+
}
85+
return res.status(403).json({ error: "Invalid or missing token" });
7186
}
7287

73-
// Add new userId
74-
userIds.add(userId);
88+
// New userId: generate token, store, and return it
89+
const newToken = generateToken();
90+
userIds.set(userId, newToken);
7591
saveUserIdsToFile();
76-
return res.status(201).json({ status: "registered" });
92+
return res.status(201).json({ status: "registered", token: newToken });
7793
});
7894

7995
// =======================

0 commit comments

Comments
 (0)