mirror of
https://github.com/sune-org/store.git
synced 2026-01-13 16:17:58 +00:00
1 line
18 KiB
JSON
1 line
18 KiB
JSON
[{"id":"4awhhn5","name":"LIVE CHAT (alpha)","pinned":false,"avatar":"data:image/webp;base64,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","url":"gh://sune-org/store/chatroom.sune","updatedAt":1757309136344,"settings":{"model":"","temperature":"","top_p":"","top_k":"","frequency_penalty":"","repetition_penalty":"","min_p":"","top_a":"","verbosity":"","reasoning_effort":"default","system_prompt":"","html":"<div class=\"max-w-md w-full m-1 p-3 font-sans bg-white rounded-2xl border border-gray-200 shadow-lg text-sm\" id=\"sune-chatroom-root\">\n <div class=\"flex justify-between items-center mb-2 px-1\">\n <h3 class=\"font-semibold text-gray-800\">Sune LIVE Chatroom</h3>\n <div class=\"flex items-center gap-3\">\n <div class=\"flex items-center gap-1.5 text-gray-500\" title=\"Users online\">\n <i data-lucide=\"users\" class=\"h-4 w-4\"></i>\n <span id=\"wsUserCount\" class=\"text-sm font-medium\">0</span>\n </div>\n <span class=\"text-xs text-gray-400\">v0.5.0</span>\n </div>\n </div>\n\n <div class=\"flex items-center justify-between gap-3 p-2 mb-2 bg-gray-50 rounded-lg\">\n <div class=\"flex items-center gap-2 truncate\">\n <span id=\"wsStatusDot\" class=\"h-3 w-3 rounded-full bg-gray-400 flex-shrink-0\"></span>\n <div class=\"text-xs text-gray-500 truncate\">\n <span id=\"wsStatusText\" class=\"font-medium text-gray-700\">Offline</span>: <span id=\"wsUsernameDisplay\" class=\"font-medium text-gray-800\"></span>\n </div>\n </div>\n <button id=\"wsConnectionButton\" class=\"px-3 py-1 text-xs text-white font-semibold bg-gray-800 rounded-md hover:bg-gray-700 active:scale-[.98] transition-transform focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-500 whitespace-nowrap\">Connect</button>\n </div>\n\n <div class=\"mt-3 pt-2 border-t border-gray-100 flex items-center justify-center gap-2 text-xs text-gray-500\">\n <i data-lucide=\"shield-check\" class=\"h-3.5 w-3.5 text-gray-400\"></i>\n <span>Moderated by Gemini 2.5 Flash-Lite</span>\n </div>\n\n <pre id=\"wsLog\" class=\"w-full h-24 p-2 bg-gray-900 text-white text-xs rounded-lg overflow-y-auto font-mono whitespace-pre-wrap break-all hidden mt-2\">Initializing...</pre>\n</div>\n\n<script>\n(() => {\n const URL = 'wss://chatsune.awww.workers.dev/ws';\n const LOG_IS_VISIBLE = false;\n const USERNAME_KEY = `sune-chatroom-username-${window.SUNE?.id || 'default'}`;\n \n const ui = {\n root: document.getElementById('sune-chatroom-root'),\n dot: document.getElementById('wsStatusDot'),\n text: document.getElementById('wsStatusText'),\n log: document.getElementById('wsLog'),\n count: document.getElementById('wsUserCount'),\n username: document.getElementById('wsUsernameDisplay'),\n button: document.getElementById('wsConnectionButton'),\n composer: document.getElementById('composer'),\n messages: document.getElementById('messages'),\n suneHtmlContainer: document.getElementById('suneHtml')\n };\n\n if (Object.values(ui).some(el => !el)) return console.error('Sune Error: Missing required UI elements (#composer, #messages, #suneHtml).');\n if (LOG_IS_VISIBLE) ui.log.classList.remove('hidden');\n\n let ws = null;\n let currentUsername = localStorage.getItem(USERNAME_KEY);\n if (!currentUsername) {\n const ADJ = ['Omnipotent','Omniscient','Divine','Celestial','Cosmic','Mystic','Sacred','Radiant','Sovereign','Supreme','Exalted','Immortal','Majestic','Mythic','Sublime','Solar','Stellar','Prophetic','Visionary'];\n const NOUN = ['Pantokrator','Thearch','Kosmokrator','Aion','Numen','Daemon','Anima','Archon','Seraph','Cherub','Kyrios','Sophos','Magus','Mystes','Oracle','Dominus','Imperator','Pontifex','Primarch','Allfather'];\n const randEl = arr => arr[Math.floor(Math.random() * arr.length)];\n currentUsername = `${randEl(ADJ)}${randEl(NOUN)}`;\n localStorage.setItem(USERNAME_KEY, currentUsername);\n }\n ui.username.textContent = currentUsername;\n\n const log = m => LOG_IS_VISIBLE && (ui.log.textContent = `[${new Date().toLocaleTimeString()}] ${m}\\n${ui.log.textContent}`.substring(0, 3000));\n \n const renderNotification = (text, type = 'system') => {\n const el = document.createElement('div');\n const styles = { system: 'text-gray-500', error: 'text-red-600 font-semibold' };\n el.className = `px-4 py-2 text-xs text-center italic ${styles[type] || styles.system}`;\n el.textContent = text;\n ui.messages.appendChild(el);\n if(ui.messages.parentElement) ui.messages.parentElement.scrollTo({ top: ui.messages.parentElement.scrollHeight, behavior: 'smooth' });\n };\n\n const updateStatus = (status, color, isConnected) => {\n ui.text.textContent = status;\n ui.dot.className = `h-3 w-3 rounded-full flex-shrink-0 ${color}`;\n ui.dot.classList.toggle('animate-pulse', status === 'Connecting');\n ui.button.textContent = isConnected ? 'Disconnect' : 'Connect';\n };\n\n const disconnect = () => {\n if (!ws || ws.readyState > 1) return;\n ws.onclose = null;\n ws.close();\n ws = null;\n updateStatus('Offline', 'bg-gray-400', false);\n log('Disconnected.');\n renderNotification('You have left the chatroom.');\n };\n\n const connect = () => {\n if (ws && ws.readyState < 2) return;\n updateStatus('Connecting', 'bg-yellow-400', true);\n ws = new WebSocket(URL);\n \n ws.onopen = () => {\n updateStatus('Connected', 'bg-green-500', true);\n log('Connection established.');\n ui.messages.innerHTML = '';\n ws.send(JSON.stringify({ type: 'USER_JOINED', payload: { name: currentUsername } }));\n };\n\n ws.onmessage = e => {\n log(`RECV: ${e.data.substring(0, 100)}`);\n try {\n const data = JSON.parse(e.data);\n const handleMsg = msg => {\n if (msg.author.name === 'system') renderNotification(msg.text);\n else window.addMessage({ role: 'assistant', content: msg.text, sune_name: msg.author.name }, false);\n };\n switch (data.type) {\n case 'HISTORY': ui.messages.innerHTML = ''; data.payload.forEach(msg => (msg.author.name === currentUsername) ? window.addMessage({ role: 'user', content: msg.text }, false) : handleMsg(msg)); break;\n case 'NEW_MESSAGE': if(data.payload.author.name !== currentUsername) handleMsg(data.payload); break;\n case 'CONNECTION_COUNT': ui.count.textContent = data.payload.count || 0; break;\n case 'ERROR': renderNotification(data.payload, 'error'); break;\n }\n } catch (err) { log(`Error parsing message: ${err}`); }\n };\n\n ws.onerror = () => log('Connection error.');\n ws.onclose = () => {\n updateStatus('Offline', 'bg-red-500', false);\n log('Connection closed by server.');\n ws = null;\n renderNotification('You have been disconnected.');\n };\n };\n\n const handleComposerSend = e => {\n const txt = (e.detail?.message?.content?.find(p => p.type === 'text')?.text || '').trim();\n if (!txt || ws?.readyState !== 1) return;\n ws.send(JSON.stringify({ type: 'NEW_MESSAGE', payload: { text: txt } }));\n log(`SENT: ${txt.substring(0, 80)}`);\n };\n \n const cleanup = () => {\n log('Sune unloaded. Cleaning up...');\n disconnect();\n ui.composer.removeEventListener('sune:send', handleComposerSend);\n observer.disconnect();\n };\n\n const observer = new MutationObserver(m => m.forEach(r => r.removedNodes.forEach(n => n === ui.root && cleanup())));\n observer.observe(ui.suneHtmlContainer, { childList: true });\n ui.button.addEventListener('click', () => ws?.readyState === 1 ? disconnect() : connect());\n ui.composer.addEventListener('sune:send', handleComposerSend);\n \n connect();\n window.lucide?.createIcons();\n})();\n</script>\n","extension_html":"<sune src='https://raw.githubusercontent.com/sune-org/store/refs/heads/main/sync.sune' private />","hide_composer":false},"storage":{}}] |