diff --git a/src/snek/static/chat-input.js b/src/snek/static/chat-input.js index 4058541..61b0464 100644 --- a/src/snek/static/chat-input.js +++ b/src/snek/static/chat-input.js @@ -25,7 +25,6 @@ class ChatInputComponent extends NjetComponent { textarea = null; _value = ""; lastUpdateEvent = null; - expiryTimer = null; queuedMessage = null; lastMessagePromise = null; _leetSpeak = false; @@ -248,7 +247,7 @@ textToLeetAdvanced(text) { this.user = user; }); - this.liveType = this.getAttribute("live-type") !== "true"; + this.liveType = this.getAttribute("live-type") == "true"; this.liveTypeInterval = parseInt(this.getAttribute("live-type-interval")) || 6; this.channelUid = this.getAttribute("channel"); @@ -388,7 +387,7 @@ textToLeetAdvanced(text) { } } - async finalizeMessage(messageUid) { + finalizeMessage(messageUid) { let value = this.value; value = this.replaceMentionsWithAuthors(value) if(this._leetSpeak){ @@ -396,18 +395,16 @@ textToLeetAdvanced(text) { }else if(this._leetSpeakAdvanced){ value = this.textToLeetAdvanced(value); } - await app.rpc.sendMessage(this.channelUid, value , true); + app.rpc.sendMessage(this.channelUid, value , true); this.value = ""; this.messageUid = null; this.queuedMessage = null; this.lastMessagePromise = null; } + + updateFromInput(value) { - if (this.expiryTimer) { - clearTimeout(this.expiryTimer); - this.expiryTimer = null; - } this.value = value; @@ -421,9 +418,6 @@ textToLeetAdvanced(text) { } async sendMessage(channelUid, value, is_final) { - if (!value.trim()) { - return null; - } return await app.rpc.sendMessage(channelUid, value, is_final); } } diff --git a/src/snek/view/rpc.py b/src/snek/view/rpc.py index d571d3f..65b1ecf 100644 --- a/src/snek/view/rpc.py +++ b/src/snek/view/rpc.py @@ -267,17 +267,43 @@ class RPCView(BaseView): } return result + + async def _finalize_message_task(self, message_uid): + await asyncio.sleep(7) + self._finalize_task = None + self._require_login() + message = await self.services.channel_message.get(message_uid) + if not message: + return False + + if message["user_uid"] != self.user_uid: + raise Exception("Not allowed") + + if not message["is_final"]: + await self.services.chat.finalize(message["uid"]) + + return True + + async def _queue_finalize_message(self, message_uid): + if self._finalize_task: + self._finalize_task.cancel() + self._finalize_task = asyncio.create_task( + self._finalize_message_task(message_uid) + ) + async def send_message(self, channel_uid, message, is_final=True): self._require_login() - #if not is_final: - # check_message = await self.services.channel_message.get(channel_uid=channel_uid, user_uid=self.user_uid,is_final=False) - # if check_message: - # return await self.update_message_text(check_message["uid"], message) - is_final = True + if not is_final: + check_message = await self.services.channel_message.get(channel_uid=channel_uid, user_uid=self.user_uid,is_final=False) + if check_message: + await self._queue_finalize_message(check_message["uid"]) + return await self.update_message_text(check_message["uid"], message) + message = await self.services.chat.send( self.user_uid, channel_uid, message, is_final ) + await self._queue_finalize_message(message["uid"]) return message["uid"] @@ -326,8 +352,10 @@ class RPCView(BaseView): return True async def update_message_text(self, message_uid, text): + async with self.app.no_save(): self._require_login() + message = await self.services.channel_message.get(message_uid) if message["user_uid"] != self.user_uid: raise Exception("Not allowed")