Install button.
This commit is contained in:
parent
030942db09
commit
438fad3014
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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')
|
||||||
|
@ -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>
|
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user