diff --git a/SHARING_GUIDE.md b/SHARING_GUIDE.md new file mode 100644 index 0000000..8c49eb4 --- /dev/null +++ b/SHARING_GUIDE.md @@ -0,0 +1,76 @@ +# π Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΡΠ°ΡΠΈΠ½Π³Ρ ΠΊΠΎΠΌΠ½Π°Ρ + +## ΠΠ°ΠΊ ΠΏΡΠΈΠ³Π»Π°ΡΠΈΡΡ Π΄ΡΡΠ·Π΅ΠΉ Π² ΠΈΠ³ΡΡ + +### Π‘ΠΏΠΎΡΠΎΠ± 1: ΠΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ +1. Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΊΠΎΠΌΠ½Π°ΡΡ ΠΈΠ»ΠΈ Π·Π°ΠΉΠ΄ΠΈΡΠ΅ Π² ΡΡΡΠ΅ΡΡΠ²ΡΡΡΡΡ +2. Π Π»ΠΎΠ±Π±ΠΈ ΠΊΠΎΠΌΠ½Π°ΡΡ Π½Π°ΠΆΠΌΠΈΡΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ **π** ΡΡΠ΄ΠΎΠΌ ΡΠΎ ΡΡΡΠ»ΠΊΠΎΠΉ +3. ΠΡΠΏΡΠ°Π²ΡΡΠ΅ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΡΡΠ»ΠΊΡ Π΄ΡΡΠ·ΡΡΠΌ Π»ΡΠ±ΡΠΌ ΡΠ΄ΠΎΠ±Π½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ + +### Π‘ΠΏΠΎΡΠΎΠ± 2: ΠΡΡΠΌΠΎΠΉ ΡΠ°ΡΠΈΠ½Π³ Π² Telegram +1. Π Π»ΠΎΠ±Π±ΠΈ ΠΊΠΎΠΌΠ½Π°ΡΡ Π½Π°ΠΆΠΌΠΈΡΠ΅ ΠΊΠ½ΠΎΠΏΠΊΡ **π± Telegram** +2. ΠΡΠ±Π΅ΡΠΈΡΠ΅ ΡΠ°Ρ ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΠ°ΠΊΡ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ +3. ΠΠ°Ρ Π΄ΡΡΠ³ ΠΏΠΎΠ»ΡΡΠΈΡ ΡΡΡΠ»ΠΊΡ Ρ ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ + +### Π‘ΠΏΠΎΡΠΎΠ± 3: ΠΡΡΠΌΠΎΠΉ ΡΠ°ΡΠΈΠ½Π³ Π² WhatsApp +1. Π Π»ΠΎΠ±Π±ΠΈ ΠΊΠΎΠΌΠ½Π°ΡΡ Π½Π°ΠΆΠΌΠΈΡΠ΅ ΠΊΠ½ΠΎΠΏΠΊΡ **π¬ WhatsApp** +2. ΠΡΠ±Π΅ΡΠΈΡΠ΅ ΡΠ°Ρ ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΠ°ΠΊΡ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ +3. ΠΠ°Ρ Π΄ΡΡΠ³ ΠΏΠΎΠ»ΡΡΠΈΡ ΡΡΡΠ»ΠΊΡ Ρ ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ + +### Π‘ΠΏΠΎΡΠΎΠ± 4: Π£Π½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ°ΡΠΈΠ½Π³ (Π½Π° ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°Ρ ) +1. Π Π»ΠΎΠ±Π±ΠΈ ΠΊΠΎΠΌΠ½Π°ΡΡ Π½Π°ΠΆΠΌΠΈΡΠ΅ ΠΊΠ½ΠΎΠΏΠΊΡ **π ΠΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ** +2. ΠΡΠ±Π΅ΡΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ (Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π½Π° Android/iOS) +3. ΠΡΠΏΡΠ°Π²ΡΡΠ΅ ΡΡΡΠ»ΠΊΡ ΡΠ΅ΡΠ΅Π· Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ + +## ΠΠ°ΠΊ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅ + +### ΠΠ°ΡΠΈΠ°Π½Ρ A: ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ +1. ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ ΠΏΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠΉ ΡΡΡΠ»ΠΊΠ΅ +2. ΠΠΎΠΉΠ΄ΠΈΡΠ΅ Π² ΠΈΠ³ΡΡ ΠΈΠ»ΠΈ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠΉΡΠ΅ΡΡ +3. ΠΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΠ΅ΡΡ ΠΊ ΠΊΠΎΠΌΠ½Π°ΡΠ΅ + +### ΠΠ°ΡΠΈΠ°Π½Ρ B: Π ΡΡΠ½ΠΎΠ΅ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ +1. ΠΠΎΠΉΠ΄ΠΈΡΠ΅ Π² ΠΈΠ³ΡΡ +2. ΠΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² ΡΠ°Π·Π΄Π΅Π» "ΠΡΠ»ΡΡΠΈΠΏΠ»Π΅Π΅Ρ" +3. ΠΠ°ΠΉΠ΄ΠΈΡΠ΅ ΠΊΠΎΠΌΠ½Π°ΡΡ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΈ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΠ΅ΡΡ + +## Π€ΠΎΡΠΌΠ°Ρ ΡΡΡΠ»ΠΊΠΈ + +Π‘ΡΡΠ»ΠΊΠ° Π½Π° ΠΊΠΎΠΌΠ½Π°ΡΡ ΠΈΠΌΠ΅Π΅Ρ Π²ΠΈΠ΄: +``` +http://localhost:3000/?room=room_1234567890_abc123 +``` + +ΠΠ΄Π΅ `room_1234567890_abc123` - ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ ID ΠΊΠΎΠΌΠ½Π°ΡΡ. + +## ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ + +- β Π‘ΡΡΠ»ΠΊΠ° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΊΠΎΠΌΠ½Π°ΡΠ° Π°ΠΊΡΠΈΠ²Π½Π° +- β ΠΠΎ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠ»ΠΊΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ³ΡΠΎΠΊΠΎΠ² +- β ΠΠΎΠΌΠ½Π°ΡΠ° Π·Π°ΠΊΡΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° Π²ΡΠ΅ ΠΈΠ³ΡΠΎΠΊΠΈ Π²ΡΡ ΠΎΠ΄ΡΡ +- β ΠΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΠ³ΡΠΎΠΊΠΎΠ² ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΠΎΠΌΠ½Π°ΡΡ + +## Π‘ΠΎΠ²Π΅ΡΡ + +1. **ΠΡΡΡΡΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅**: ΠΠ»ΠΈΠΊΠ½ΠΈΡΠ΅ Π½Π° ΠΏΠΎΠ»Π΅ ΡΠΎ ΡΡΡΠ»ΠΊΠΎΠΉ - ΡΠ΅ΠΊΡΡ Π²ΡΠ΄Π΅Π»ΠΈΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ +2. **ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΡΡΠ»ΠΊΠΈ**: Π‘ΡΡΠ»ΠΊΠ° ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ½Π°ΡΡ +3. **ΠΠΎΠ±ΠΈΠ»ΡΠ½ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π°**: ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΊΠ½ΠΎΠΏΠΊΡ "ΠΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ" Π΄Π»Ρ Π±ΡΡΡΡΠΎΠ³ΠΎ ΡΠ°ΡΠΈΠ½Π³Π° +4. **Telegram/WhatsApp**: Π Π°Π±ΠΎΡΠ°Π΅Ρ ΠΊΠ°ΠΊ Π½Π° Π΄Π΅ΡΠΊΡΠΎΠΏΠ΅, ΡΠ°ΠΊ ΠΈ Π½Π° ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°Ρ + +## Π’Π΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ + +### ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΡ +- Chrome/Edge: Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ +- Firefox: Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ +- Safari (iOS): Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΠΊΠ»ΡΡΠ°Ρ Web Share API +- ΠΠΎΠ±ΠΈΠ»ΡΠ½ΡΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΡ: ΠΏΠΎΠ»Π½Π°Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° + +### API +- **Clipboard API** - Π΄Π»Ρ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΠ»ΠΊΠΈ +- **Web Share API** - Π΄Π»Ρ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΠΈΠ½Π³Π° (ΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π°) +- **URL Parameters** - Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ID ΠΊΠΎΠΌΠ½Π°ΡΡ + +### ΠΠ΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ +- ID ΠΊΠΎΠΌΠ½Π°ΡΡ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅ +- ΠΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Π»Π°ΡΡ ΠΈΠ»ΠΈ ΡΠ³Π°Π΄Π°ΡΡ ID +- ΠΠΎΠΌΠ½Π°ΡΠ° Π΄ΠΎΡΡΡΠΏΠ½Π° ΡΠΎΠ»ΡΠΊΠΎ Π°ΠΊΡΠΈΠ²Π½ΡΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ diff --git a/database.js b/database.js index e97c905..0a67caa 100644 --- a/database.js +++ b/database.js @@ -40,6 +40,9 @@ async function initDatabase() { // Π‘ΠΎΠ·Π΄Π°ΡΠΌ Π°Π΄ΠΌΠΈΠ½Π° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ await createDefaultAdmin(); + // ΠΡΠ΅Π³Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π°Π΄ΠΌΠΈΠ½ΡΠΊΠΈΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ + initDefaultAdminSettings(); + return db; } @@ -150,9 +153,6 @@ async function createDefaultAdmin() { saveDatabase(); console.log('π Π‘ΠΎΠ·Π΄Π°Π½ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: admin / admin123'); } - - // ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π΄Π΅ΡΠΎΠ»ΡΠ½ΡΠ΅ Π°Π΄ΠΌΠΈΠ½ΡΠΊΠΈΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ - initDefaultAdminSettings(); } /** diff --git a/poker.db b/poker.db index 31a3e37..abb938f 100644 Binary files a/poker.db and b/poker.db differ diff --git a/public/auth.js b/public/auth.js index 7843631..fbfe201 100644 --- a/public/auth.js +++ b/public/auth.js @@ -188,6 +188,11 @@ function onAuthSuccess() { if (!isGuest && authToken) { loadUserSettingsFromServer(); } + + // ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π½Π°Π»ΠΈΡΠΈΠ΅ ΠΊΠΎΠΌΠ½Π°ΡΡ Π² URL Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ + if (typeof checkRoomInUrl === 'function') { + checkRoomInUrl(); + } } /** @@ -198,6 +203,7 @@ function updateUserDisplay() { const badgeEl = document.getElementById('user-role-badge'); const adminBtn = document.getElementById('admin-btn'); const serverUrlGroup = document.getElementById('server-url-group'); + const adminLlmButtonGroup = document.getElementById('admin-llm-button-group'); if (currentUser) { nameEl.textContent = currentUser.username; @@ -207,10 +213,12 @@ function updateUserDisplay() { badgeEl.textContent = 'ADMIN'; if (adminBtn) adminBtn.style.display = 'block'; if (serverUrlGroup) serverUrlGroup.style.display = 'block'; + if (adminLlmButtonGroup) adminLlmButtonGroup.style.display = 'block'; } else { badgeEl.style.display = 'none'; if (adminBtn) adminBtn.style.display = 'none'; if (serverUrlGroup) serverUrlGroup.style.display = 'none'; + if (adminLlmButtonGroup) adminLlmButtonGroup.style.display = 'none'; } // ΠΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΠΏΠΎΠ»Ρ ΠΈΠΌΠ΅Π½ΠΈ Π² ΡΠΎΡΠΌΠ°Ρ @@ -363,7 +371,12 @@ function switchAdminTab(tab) { * ΠΠ°Π³ΡΡΠ·ΠΈΡΡ Π°Π΄ΠΌΠΈΠ½ΡΠΊΠΈΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ */ async function loadAdminSettings() { - if (!authToken || currentUser?.role !== 'admin') return; + if (!authToken || currentUser?.role !== 'admin') { + console.log('β ΠΠ΅Ρ ΠΏΡΠ°Π² Π΄Π»Ρ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π°Π΄ΠΌΠΈΠ½ Π½Π°ΡΡΡΠΎΠ΅ΠΊ'); + return; + } + + console.log('π₯ ΠΠ°Π³ΡΡΠ·ΠΊΠ° Π°Π΄ΠΌΠΈΠ½ΡΠΊΠΈΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ...'); try { const response = await fetch('/api/settings/admin', { @@ -374,14 +387,18 @@ async function loadAdminSettings() { const data = await response.json(); const s = data.settings; + console.log('β ΠΠΎΠ»ΡΡΠ΅Π½Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ:', s); + document.getElementById('admin-llm-enabled').checked = s.llmEnabled; document.getElementById('admin-llm-provider').value = s.llmProvider || 'ollama'; document.getElementById('admin-llm-url').value = s.llmApiUrl || 'http://localhost:11434'; document.getElementById('admin-llm-model').value = s.llmModel || 'llama3.2'; document.getElementById('admin-llm-apikey').value = s.llmApiKey || ''; + } else { + console.error('β ΠΡΠΈΠ±ΠΊΠ° ΠΎΡΠ²Π΅ΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°:', response.status); } } catch (error) { - console.error('ΠΡΠΈΠ±ΠΊΠ° Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π°Π΄ΠΌΠΈΠ½ Π½Π°ΡΡΡΠΎΠ΅ΠΊ:', error); + console.error('β ΠΡΠΈΠ±ΠΊΠ° Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π°Π΄ΠΌΠΈΠ½ Π½Π°ΡΡΡΠΎΠ΅ΠΊ:', error); } } @@ -399,6 +416,8 @@ async function saveAdminSettings() { llmApiKey: document.getElementById('admin-llm-apikey').value }; + console.log('πΎ Π‘ΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π°Π΄ΠΌΠΈΠ½ΡΠΊΠΈΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ:', settings); + try { const response = await fetch('/api/settings/admin', { method: 'POST', @@ -411,9 +430,14 @@ async function saveAdminSettings() { if (response.ok) { showNotification('ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠΎΡ ΡΠ°Π½Π΅Π½Ρ', 'success'); + // ΠΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΡΡΠ°ΡΡΡ LLM Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ + loadLLMStatus(); + } else { + showNotification('ΠΡΠΈΠ±ΠΊΠ° ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ', 'error'); } } catch (error) { showNotification('ΠΡΠΈΠ±ΠΊΠ° ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ', 'error'); + console.error('ΠΡΠΈΠ±ΠΊΠ°:', error); } } diff --git a/public/index.html b/public/index.html index 5db2e67..d86f008 100644 --- a/public/index.html +++ b/public/index.html @@ -221,6 +221,27 @@