Install button.

This commit is contained in:
retoor 2025-01-29 06:43:42 +01:00
parent 030942db09
commit 438fad3014
4 changed files with 84 additions and 25 deletions

View File

@ -298,6 +298,10 @@ class Socket extends EventHandler {
}) })
} }
onData(data) { onData(data) {
if(data.success != undefined && !data.success){
console.error(data)
}
if (data.callId) { if (data.callId) {
this.emit(data.callId, data.data) this.emit(data.callId, data.data)
} }

View File

@ -22,14 +22,7 @@ class ChatWindowElement extends HTMLElement {
const chatHeader = document.createElement("div") const chatHeader = document.createElement("div")
chatHeader.classList.add("chat-header") chatHeader.classList.add("chat-header")
let installPrompt = null
window.addEventListener("beforeinstallprompt", async(event) => {
event.preventDefault();
installPrompt = event;
const result = await installPrompt.prompt()
console.info(result.outcome)
//installButton.removeAttribute("hidden");
});
const chatTitle = document.createElement('h2') const chatTitle = document.createElement('h2')

View File

@ -35,9 +35,28 @@
<li><a href="#">Development</a></li> <li><a href="#">Development</a></li>
<li><a href="#">Support</a></li> <li><a href="#">Support</a></li>
<li><a href="#">Random</a></li> <li><a href="#">Random</a></li>
</ul> </ul>
<fancy-button id="install-button" style="display:none" text="Install">Install</fancy-button>
</aside> </aside>
<chat-window class="chat-area"></chat-window> <chat-window class="chat-area"></chat-window>
</main> </main>
<script>
let installPrompt = null
window.addEventListener("beforeinstallprompt", async(event) => {
event.preventDefault();
installPrompt = event;
//document.addEventListener("DOMContentLoaded", () => {
const button = document.getElementById("install-button")
button.addEventListener("click", async ()=>{
const result = await installPrompt.prompt()
console.info(result.outcome)
})
button.style.display = 'block'
});
;
</script>
</body> </body>
</html> </html>

View File

@ -4,26 +4,60 @@ from snek.system.view import BaseView
class RPCView(BaseView): class RPCView(BaseView):
login_required = True
class RPCApi: class RPCApi:
def __init__(self,view, ws): def __init__(self,view, ws):
self.view = view self.view = view
self.app = self.view.app self.app = self.view.app
self.services = self.app.services self.services = self.app.services
self.user_uid = self.view.session.get("uid")
self.ws = ws self.ws = ws
@property
def user_uid(self):
return self.view.session.get("uid")
@property
def request(self):
return self.view.request
def _require_login(self):
if not self.is_logged_in:
raise Exception("Not logged in")
@property
def is_logged_in(self):
return self.view.session.get("logged_in", False)
async def login(self, username, password):
success = await self.services.user.validate_login(username, password)
if not success:
raise Exception("Invalid username or password")
user = await self.services.user.get(username=username)
self.view.session["uid"] = user["uid"]
self.view.session["logged_in"] = True
self.view.session["username"] = user["username"]
self.view.session["user_nick"] = user["nick"]
record = user.record
del record['password']
del record['deleted_at']
await self.services.socket.add(self.ws)
async for subscription in self.services.channel_member.find(user_uid=self.view.request.session.get("uid"),deleted_at=None,is_banned=False):
await self.services.socket.subscribe(self.ws,subscription["channel_uid"])
return record
async def get_user(self, user_uid): async def get_user(self, user_uid):
self._require_login()
if not user_uid: if not user_uid:
user_uid = self.user_uid user_uid = self.user_uid
user = await self.services.user.get(uid=user_uid) user = await self.services.user.get(uid=user_uid)
record = user.record record = user.record
del record['password'] del record['password']
del record['deleted_at'] del record['deleted_at']
del record['email'] if not user_uid == user["uid"]:
del record['email']
return record return record
async def get_messages(self, channel_uid,offset=0): async def get_messages(self, channel_uid,offset=0):
self._require_login()
messages = [] messages = []
async for message in self.services.channel_message.query("SELECT * FROM channel_message ORDER BY created_at DESC LIMIT 60"): #"SELECT uid, channel_uid, user_uid, message, created_at FROM channel_message WHERE channel_uid = :channel_uid ORDER BY created_at DESC LIMIT 30 OFFSET :offset",{"channel_uid":channel_uid,"offset":int(offset)}): async for message in self.services.channel_message.query("SELECT * FROM channel_message ORDER BY created_at DESC LIMIT 60"): #"SELECT uid, channel_uid, user_uid, message, created_at FROM channel_message WHERE channel_uid = :channel_uid ORDER BY created_at DESC LIMIT 30 OFFSET :offset",{"channel_uid":channel_uid,"offset":int(offset)}):
@ -44,6 +78,7 @@ class RPCView(BaseView):
return messages return messages
async def get_channels(self): async def get_channels(self):
self._require_login()
channels = [] channels = []
async for subscription in self.services.channel_member.find(user_uid=self.user_uid,is_banned=False): async for subscription in self.services.channel_member.find(user_uid=self.user_uid,is_banned=False):
channels.append(dict( channels.append(dict(
@ -55,11 +90,13 @@ class RPCView(BaseView):
return channels return channels
async def send_message(self, room, message): async def send_message(self, room, message):
self._require_login()
await self.services.chat.send(self.user_uid,room,message) await self.services.chat.send(self.user_uid,room,message)
return True return True
async def echo(self,*args): async def echo(self,*args):
self._require_login()
return args return args
@ -67,16 +104,21 @@ class RPCView(BaseView):
async def __call__(self, data): async def __call__(self, data):
call_id = data.get("callId") try:
method_name = data.get("method") call_id = data.get("callId")
args = data.get("args") method_name = data.get("method")
if hasattr(super(),method_name) or not hasattr(self,method_name): if method_name.startswith("_"):
return await self.ws.send_json({"callId":call_id,"data":"Not allowed"}) raise Exception("Not allowed")
args = data.get("args")
method = getattr(self,method_name.replace(".","_"),None) if hasattr(super(),method_name) or not hasattr(self,method_name):
result = await method(*args) return await self.ws.send_json({"callId":call_id,"data":"Not allowed"})
await self.ws.send_json({"callId":call_id,"data":result}) method = getattr(self,method_name.replace(".","_"),None)
if not method:
raise Exception("Method not found")
result = await method(*args)
await self.ws.send_json({"callId":call_id,"success":True,"data":result})
except Exception as ex:
await self.ws.send_json({"callId":call_id,"success":False,"data":str(ex)})
async def call_ping(self,callId,*args): async def call_ping(self,callId,*args):
return {"pong": args} return {"pong": args}
@ -87,9 +129,10 @@ class RPCView(BaseView):
ws = web.WebSocketResponse() ws = web.WebSocketResponse()
await ws.prepare(self.request) await ws.prepare(self.request)
await self.services.socket.add(ws) if self.request.session.get("logged_in") is True:
async for subscription in self.services.channel_member.find(user_uid=self.session.get("uid"),deleted_at=None,is_banned=False): await self.services.socket.add(ws)
await self.services.socket.subscribe(ws,subscription["channel_uid"]) async for subscription in self.services.channel_member.find(user_uid=self.request.session.get("uid"),deleted_at=None,is_banned=False):
await self.services.socket.subscribe(ws,subscription["channel_uid"])
print("Subscribed for: ", subscription["label"],flush=True) print("Subscribed for: ", subscription["label"],flush=True)
rpc = RPCView.RPCApi(self,ws) rpc = RPCView.RPCApi(self,ws)
async for msg in ws: async for msg in ws: