diff --git a/src/snek/service/socket.py b/src/snek/service/socket.py index b7f172a..0c11208 100644 --- a/src/snek/service/socket.py +++ b/src/snek/service/socket.py @@ -22,7 +22,8 @@ class SocketService(BaseService): async def broadcast(self, channel_uid, message): print("BROADCAT!",message) count = 0 - for ws in self.subscriptions.get(channel_uid,[]): + subscriptions = set(self.subscriptions.get(channel_uid,[])) + for ws in subscriptions: try: await ws.send_json(message) except Exception as ex: diff --git a/src/snek/static/chat-input.js b/src/snek/static/chat-input.js index fcf925b..1ea2c2e 100644 --- a/src/snek/static/chat-input.js +++ b/src/snek/static/chat-input.js @@ -8,6 +8,7 @@ class ChatInputElement extends HTMLElement { this.shadowRoot.appendChild(this.component); } connectedCallback() { + const me = this const link = document.createElement("link") link.rel = 'stylesheet' link.href = '/base.css' @@ -18,22 +19,31 @@ class ChatInputElement extends HTMLElement { `; - this.container.querySelector('textarea').addEventListener('input', (e) => { - this.dispatchEvent(new CustomEvent("input", {detail:e.target.value,bubbles:true})) + this.textBox = this.container.querySelector('textarea') + this.textBox.addEventListener('input', (e) => { + this.dispatchEvent(new CustomEvent("input", { detail: e.target.value, bubbles: true })) const message = e.target.value; const button = this.container.querySelector('button'); button.disabled = !message; }) - this.container.querySelector('textarea').addEventListener('change',(e)=>{ - this.dispatchEvent(new CustomEvent("change", {detail:e.target.value,bubbles:true})) + this.textBox.addEventListener('change', (e) => { + this.dispatchEvent(new CustomEvent("change", { detail: e.target.value, bubbles: true })) console.error(e.target.value) }) - this.container.querySelector('textarea').addEventListener('keyup', (e) => { - if(e.key == 'Enter' && !e.shiftKey){ - this.dispatchEvent(new CustomEvent("submit", {detail:e.target.value,bubbles:true})) + this.textBox.addEventListener('keyup', (e) => { + if (e.key == 'Enter' && !e.shiftKey) { + this.dispatchEvent(new CustomEvent("submit", { detail: e.target.value, bubbles: true })) e.target.value = '' } }) + + this.container.querySelector('button').addEventListener('click', (e) => { + this.dispatchEvent(new CustomEvent("submit", { detail: me.textBox.value, bubbles: true })) + setTimeout(()=>{ + me.textBox.value = '' + me.textBox.focus() + },200) + }) this.component.appendChild(this.container) } } diff --git a/src/snek/static/chat-window.js b/src/snek/static/chat-window.js index 9e0e648..c5e3d61 100644 --- a/src/snek/static/chat-window.js +++ b/src/snek/static/chat-window.js @@ -36,7 +36,7 @@ class ChatWindowElement extends HTMLElement { this.container.appendChild(channelElement) const chatInput = document.createElement('chat-input') - chatInput.classList.add("chat-input") + chatInput.addEventListener("submit",(e)=>{ app.rpc.sendMessage(channel.uid,e.detail) })