diff --git a/lnbits/extensions/diagonalley/notifier.py b/lnbits/extensions/diagonalley/notifier.py
new file mode 100644
index 000000000..58a9f2bb7
--- /dev/null
+++ b/lnbits/extensions/diagonalley/notifier.py
@@ -0,0 +1,83 @@
+## adapted from https://github.com/Sentymental/chat-fastapi-websocket
+"""
+Create a class Notifier that will handle messages
+and delivery to the specific person
+"""
+
+from collections import defaultdict
+
+from fastapi import WebSocket
+from loguru import logger
+
+
+class Notifier:
+ """
+ Manages chatrooms, sessions and members.
+
+ Methods:
+ - get_notification_generator(self): async generator with notification messages
+ - get_members(self, room_name: str): get members in room
+ - push(message: str, room_name: str): push message
+ - connect(websocket: WebSocket, room_name: str): connect to room
+ - remove(websocket: WebSocket, room_name: str): remove
+ - _notify(message: str, room_name: str): notifier
+ """
+
+ def __init__(self):
+ # Create sessions as a dict:
+ self.sessions: dict = defaultdict(dict)
+
+ # Create notification generator:
+ self.generator = self.get_notification_generator()
+
+ async def get_notification_generator(self):
+ """Notification Generator"""
+
+ while True:
+ message = yield
+ msg = message["message"]
+ room_name = message["room_name"]
+ await self._notify(msg, room_name)
+
+ def get_members(self, room_name: str):
+ """Get all members in a room"""
+
+ try:
+ logger.info(f"Looking for members in room: {room_name}")
+ return self.sessions[room_name]
+
+ except Exception:
+ logger.exception(f"There is no member in room: {room_name}")
+ return None
+
+ async def push(self, message: str, room_name: str = None):
+ """Push a message"""
+
+ message_body = {"message": message, "room_name": room_name}
+ await self.generator.asend(message_body)
+
+ async def connect(self, websocket: WebSocket, room_name: str):
+ """Connect to room"""
+
+ await websocket.accept()
+ if self.sessions[room_name] == {} or len(self.sessions[room_name]) == 0:
+ self.sessions[room_name] = []
+
+ self.sessions[room_name].append(websocket)
+ print(f"Connections ...: {self.sessions[room_name]}")
+
+ def remove(self, websocket: WebSocket, room_name: str):
+ """Remove websocket from room"""
+
+ self.sessions[room_name].remove(websocket)
+ print(f"Connection removed...\nOpen connections...: {self.sessions[room_name]}")
+
+ async def _notify(self, message: str, room_name: str):
+ """Notifier"""
+
+ remaining_sessions = []
+ while len(self.sessions[room_name]) > 0:
+ websocket = self.sessions[room_name].pop()
+ await websocket.send_text(message)
+ remaining_sessions.append(websocket)
+ self.sessions[room_name] = remaining_sessions
diff --git a/lnbits/extensions/diagonalley/templates/diagonalley/chat.html b/lnbits/extensions/diagonalley/templates/diagonalley/chat.html
index bb3e607fd..1713c9e24 100644
--- a/lnbits/extensions/diagonalley/templates/diagonalley/chat.html
+++ b/lnbits/extensions/diagonalley/templates/diagonalley/chat.html
@@ -45,13 +45,15 @@
+
Public Key: {{ sliceKey(stall.publickey) }}
- {{ stall.name }}
-
+
-->
{{ type == 'publickey' ? 'Public Key' : 'Private Key' }}
+ {% endraw %} +
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Dolore,
@@ -123,7 +135,9 @@
showMessages: false,
messages: {},
stall: null,
+ selectedOrder: null,
orders: [],
+ user: null,
// Mock data
model: null,
mockMerch: ['Google', 'Facebook', 'Twitter', 'Apple', 'Oracle'],
@@ -136,29 +150,108 @@
this.newMessage = ''
this.$refs.newMessage.focus()
},
- sendMessage() {
+ sendMessage(e) {
let message = {
key: Date.now(),
text: this.newMessage,
from: 'me'
}
- this.$set(this.messages, message.key, message)
+ ws.send(JSON.stringify(message))
this.clearMessage()
+ e.preventDefault()
},
sliceKey(key) {
if (!key) return ''
return `${key.slice(0, 4)}...${key.slice(-4)}`
+ },
+ async generateKeys() {
+ await LNbits.api
+ .request('GET', '/diagonalley/api/v1/keys', null)
+ .then(response => {
+ if (response.data) {
+ let data = {
+ keys: {
+ privatekey: response.data.privkey,
+ publickey: response.data.pubkey
+ }
+ }
+ this.user = data
+ console.log('Keys done', this.user)
+ return
+ }
+ })
+ .catch(function (error) {
+ LNbits.utils.notifyApiError(error)
+ })
+ },
+ changeOrder() {
+ console.log(this.selectedOrder)
+ },
+ startChat(room_name) {
+ if (location.protocol == 'https:') {
+ ws_scheme = 'wss://'
+ } else {
+ ws_scheme = 'ws://'
+ }
+ ws = new WebSocket(
+ ws_scheme + location.host + '/diagonalley/ws/' + room_name
+ )
+
+ function checkWebSocket(event) {
+ if (ws.readyState === WebSocket.CLOSED) {
+ console.log('WebSocket CLOSED: Reopening')
+ ws = new WebSocket(
+ ws_scheme + location.host + '/diagonalley/ws/' + room_name
+ )
+ }
+ }
+
+ ws.onmessage = event => {
+ let event_data = JSON.parse(event.data)
+
+ this.$set(this.messages, event_data.key, event_data)
+ this.$q.localStorage.set()
+ }
+
+ this.ws = ws
}
},
- created() {
- let stall = JSON.parse('{{ stall | tojson }}')
- let orders = JSON.parse('{{ orders | tojson }}')
+ async created() {
+ this.stall = JSON.parse('{{ stall | tojson }}')
- this.stall = stall
- this.orders = orders
- console.log(stall)
- console.log(orders)
+ let order_details = JSON.parse('{{ order | tojson }}')
+ let order_id = order_details[0].order_id
+
+ let data = this.$q.localStorage.getItem(`lnbits.diagonalley.data`)
+
+ try {
+ if (data) {
+ this.user = data
+ //add chat key (merchant pubkey) if not set
+ if (!this.user.chats[`${this.stall.publickey}`]) {
+ this.$set(this.user.chats, this.stall.publickey, [])
+ }
+ //this.$q.localStorage.set(`lnbits.diagonalley.data`, this.user)
+ } else {
+ // generate keys
+ await this.generateKeys()
+ // populate user data
+ this.user.chats = {
+ [`${this.stall.publickey}`]: []
+ }
+ this.user.orders = []
+ }
+
+ this.order_details = order_details
+ this.user.orders = [...new Set([...this.user.orders, order_id])]
+ this.selectedOrder = order_id
+
+ this.$q.localStorage.set(`lnbits.diagonalley.data`, this.user)
+ this.startChat(order_id)
+ } catch (e) {
+ console.error(e)
+ }
}
})
diff --git a/lnbits/extensions/diagonalley/templates/diagonalley/index.html b/lnbits/extensions/diagonalley/templates/diagonalley/index.html
index cd03e6f35..5ad6f6a5e 100644
--- a/lnbits/extensions/diagonalley/templates/diagonalley/index.html
+++ b/lnbits/extensions/diagonalley/templates/diagonalley/index.html
@@ -644,7 +644,7 @@
icon="storefront"
:color="($q.dark.isActive) ? 'grey-7' : 'grey-5'"
type="a"
- :href="'/diagonalley/' + props.row.id"
+ :href="'/diagonalley/stalls/' + props.row.id"
target="_blank"
>