| Server IP : 45.94.215.241 / Your IP : 216.73.216.243 Web Server : Apache/2.4.66 (Ubuntu) System : Linux srv2937474766 7.0.0-28-generic #28-Ubuntu SMP PREEMPT_DYNAMIC Sun Jun 21 01:01:36 UTC 2026 x86_64 User : www-data ( 33) PHP Version : 8.5.4 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/html/chat/Chat3/ |
Upload File : |
const WebSocket = require('ws');
const Database = require('better-sqlite3');
const fs = require('fs');
const path = require('path');
// نام فایل دیتابیس
const DB_PATH = path.join(__dirname, 'chat.db');
// ایجاد اتصال به دیتابیس
const db = new Database(DB_PATH);
db.pragma('journal_mode = WAL'); // برای بهبود عملکرد
// --- ایجاد جداول (اگر وجود ندارند) ---
const initDb = () => {
// جدول کاربران
db.exec(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password TEXT NOT NULL,
is_active INTEGER DEFAULT 0
)
`);
// جدول پیامها
db.exec(`
CREATE TABLE IF NOT EXISTS messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
sender_id INTEGER NOT NULL,
body TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY(sender_id) REFERENCES users(id)
)
`);
};
initDb();
// تنظیمات WebSocket
const wss = new WebSocket.Server({ port: 8080 });
const clients = new Map(); // نگهداری اتصالات: userId -> ws
console.log('سرور WebSocket روی پورت ۸۰۸۰ اجرا شد...');
wss.on('connection', (ws) => {
let userId = null;
ws.on('message', (message) => {
try {
const data = JSON.parse(message);
// ۱. احراز هویت ساده
if (data.type === 'auth') {
userId = data.userId;
clients.set(userId, ws);
// وضعیت آنلاین شدن در دیتابیس
db.prepare('UPDATE users SET is_active = 1 WHERE id = ?').run(userId);
// ارسال پیام خوشآمدگویی
ws.send(JSON.stringify({ type: 'info', msg: 'متصل شدید' }));
}
// ۲. دریافت و ارسال پیام
else if (data.type === 'send_message') {
if (!userId) return;
const { body } = data;
// ذخیره در دیتابیس
const info = db.prepare('INSERT INTO messages (sender_id, body) VALUES (?, ?)').run(userId, body);
const newMessage = {
id: info.lastInsertRowid,
sender_id: userId,
body: body,
is_me: false // برای گیرنده
};
// ارسال به همه کاربران آنلاین
clients.forEach((clientWs, id) => {
if (clientWs.readyState === WebSocket.OPEN) {
// اگر پیام متعلق به خود کاربر است، پرچم is_me را true کن
const msgToSend = { ...newMessage, is_me: (id === userId) };
clientWs.send(JSON.stringify({ type: 'new_message', data: msgToSend }));
}
});
}
} catch (err) {
console.error('Error:', err);
}
});
ws.on('close', () => {
if (userId) {
clients.delete(userId);
db.prepare('UPDATE users SET is_active = 0 WHERE id = ?').run(userId);
console.log(`User ${userId} disconnected`);
}
});
});