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 . import db
from .models import ( from .models import (
CreateChatMessage,
CreateMarket, CreateMarket,
CreateMarketStalls, CreateMarketStalls,
Market, Market,
@ -405,3 +406,17 @@ async def create_diagonalley_market_stalls(
async def update_diagonalley_market(market_id): async def update_diagonalley_market(market_id):
pass 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): class CreateMarketStalls(BaseModel):
stallid: str 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 and delivery to the specific person
""" """
import json
from collections import defaultdict from collections import defaultdict
from fastapi import WebSocket from fastapi import WebSocket
from loguru import logger from loguru import logger
from lnbits.extensions.diagonalley.crud import create_chat_message
from lnbits.extensions.diagonalley.models import CreateChatMessage
class Notifier: class Notifier:
""" """
@ -75,6 +79,12 @@ class Notifier:
async def _notify(self, message: str, room_name: str): async def _notify(self, message: str, room_name: str):
"""Notifier""" """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 = [] remaining_sessions = []
while len(self.sessions[room_name]) > 0: while len(self.sessions[room_name]) > 0:
websocket = self.sessions[room_name].pop() websocket = self.sessions[room_name].pop()

View file

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

View file

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