chat messages stored in db
This commit is contained in:
parent
8ab9590594
commit
57bb9665c6
6 changed files with 80 additions and 15 deletions
|
|
@ -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,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -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)")
|
||||||
|
|
|
||||||
|
|
@ -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(...)
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue