chat messages stored in db

This commit is contained in:
Tiago vasconcelos 2022-09-30 10:16:34 +01:00
parent 8ab9590594
commit 57bb9665c6
6 changed files with 80 additions and 15 deletions

View file

@ -9,6 +9,7 @@ from lnbits.settings import WALLET
from . import db
from .models import (
CreateChatMessage,
CreateMarket,
CreateMarketStalls,
Market,
@ -405,3 +406,17 @@ async def create_diagonalley_market_stalls(
async def update_diagonalley_market(market_id):
pass
async def create_chat_message(data: CreateChatMessage):
print("DATA", data)
await db.execute(
"""
INSERT INTO diagonalley.messages (msg, pubkey, id_conversation)
VALUES (?, ?, ?)
""",
(
data.msg,
data.pubkey,
data.room_name,
),
)

View file

@ -113,3 +113,27 @@ async def m001_initial(db):
);
"""
)
async def m002_add_chat_messages(db):
"""
Initial chat messages table.
"""
await db.execute(
f"""
CREATE TABLE diagonalley.messages (
id {db.serial_primary_key},
msg TEXT NOT NULL,
pubkey TEXT NOT NULL,
id_conversation TEXT NOT NULL,
timestamp TIMESTAMP NOT NULL DEFAULT """
+ db.timestamp_now
+ """
);
"""
)
"""
Create indexes for message fetching
"""
await db.execute("CREATE INDEX idx_messages_timestamp ON diagonalley.messages (timestamp DESC)")
await db.execute("CREATE INDEX idx_messages_conversations ON diagonalley.messages (id_conversation)")

View file

@ -107,3 +107,16 @@ class Market(BaseModel):
class CreateMarketStalls(BaseModel):
stallid: str
class ChatMessage(BaseModel):
id: str
msg: str
pubkey: str
id_conversation: str
timestamp: int
class CreateChatMessage(BaseModel):
msg: str = Query(..., min_length=1)
pubkey: str = Query(...)
room_name: str = Query(...)

View file

@ -4,11 +4,15 @@ Create a class Notifier that will handle messages
and delivery to the specific person
"""
import json
from collections import defaultdict
from fastapi import WebSocket
from loguru import logger
from lnbits.extensions.diagonalley.crud import create_chat_message
from lnbits.extensions.diagonalley.models import CreateChatMessage
class Notifier:
"""
@ -75,6 +79,12 @@ class Notifier:
async def _notify(self, message: str, room_name: str):
"""Notifier"""
d = json.loads(message)
d["room_name"] = room_name
db_msg = CreateChatMessage.parse_obj(d)
print("NOT:", db_msg)
await create_chat_message(data=db_msg)
remaining_sessions = []
while len(self.sessions[room_name]) > 0:
websocket = self.sessions[room_name].pop()

View file

@ -7,12 +7,12 @@
<!-- <p v-if="Object.keys(messages).length === 0">No messages yet</p> -->
<div class="chat-messages">
<q-chat-message
:key="key"
v-for="(message, key) in messages"
:name="message.from == 'me' ? 'me' : 'merchant'"
:text="[message.text]"
:sent="message.from == 'me' ? true : false"
:bg-color="message.from == 'me' ? 'white' : 'light-green-2'"
:key="index"
v-for="(message, index) in messages"
:name="message.pubkey == user.keys.publickey ? 'me' : 'merchant'"
:text="[message.msg]"
:sent="message.pubkey == user.keys.publickey ? true : false"
:bg-color="message.pubkey == user.keys.publickey ? 'white' : 'light-green-2'"
/>
</div>
</div>
@ -125,6 +125,9 @@
</div>
{% endblock %} {% block scripts %}
<script>
const mapChatMsg = obj => {
return
}
Vue.component(VueQrcode.name, VueQrcode)
new Vue({
el: '#vue',
@ -150,16 +153,14 @@
this.newMessage = ''
this.$refs.newMessage.focus()
},
sendMessage(e) {
sendMessage() {
let message = {
key: Date.now(),
text: this.newMessage,
from: 'me'
msg: this.newMessage,
pubkey: this.user.keys.publickey
}
ws.send(JSON.stringify(message))
this.clearMessage()
e.preventDefault()
},
sliceKey(key) {
if (!key) return ''
@ -210,8 +211,8 @@
ws.onmessage = event => {
let event_data = JSON.parse(event.data)
this.$set(this.messages, event_data.key, event_data)
this.$q.localStorage.set()
this.$set(this.messages, Date.now(), event_data)
console.log(this.messages)
}
this.ws = ws

View file

@ -12,9 +12,11 @@ from starlette.responses import HTMLResponse
from lnbits.core.models import User
from lnbits.decorators import check_user_exists # type: ignore
from lnbits.extensions.diagonalley import diagonalley_ext, diagonalley_renderer
from lnbits.extensions.diagonalley.models import CreateChatMessage
from lnbits.extensions.diagonalley.notifier import Notifier
from .crud import (
create_chat_message,
get_diagonalley_market,
get_diagonalley_market_stalls,
get_diagonalley_order_details,
@ -137,7 +139,7 @@ async def websocket_endpoint(
print("Sender not in room member: Reconnecting...")
await notifier.connect(websocket, room_name)
await notifier._notify(f"{data}", room_name)
await notifier._notify(data, room_name)
except WebSocketDisconnect:
notifier.remove(websocket, room_name)