This commit is contained in:
retoor 2025-02-08 17:07:04 +01:00
parent 7ca2bc5776
commit f291c0f2e4
4 changed files with 18 additions and 65 deletions

View File

@ -20,7 +20,7 @@ class RegisterForm(Form):
required=True,
min_length=2,
max_length=20,
regex=r"^[a-zA-Z0-9_]+$",
regex=r"^[a-zA-Z0-9_-]+$",
place_holder="Username",
type="text",
)

View File

@ -4,6 +4,15 @@ from snek.system.service import BaseService
class UserService(BaseService):
mapper_name = "user"
async def search(self, query, **kwargs):
query = query.strip().lower()
if not query:
raise []
results = []
async for result in self.find(username=dict(ilike='%' + query + '%'), **kwargs):
results.append(result)
return results
async def validate_login(self, username, password):
model = await self.get(username=username)

View File

@ -1,65 +1,4 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Snek</title>
<style>{{highlight_styles}}</style>
<script src="/push.js"></script>
<script src="/upload-button.js"></script>
<script src="/html-frame.js"></script>
<script src="/schedule.js"></script>
<script src="/app.js"></script>
<script src="/models.js"></script>
<script src="/message-list.js"></script>
<script src="/message-list-manager.js"></script>
<script src="/chat-input.js"></script>
<script src="/chat-window.js"></script>
<link rel="stylesheet" href="/base.css">
<link rel="manifest" href="/manifest.json" />
<link rel="icon" type="image/png" href="/image/snek1.png" sizes="32x32">
</head>
<body>
<header>
<div class="logo">Snek</div>
<nav>
<a href="/web.html">🏠</a>
<a style="display:none" id="install-button" href="#">📥</a>
<a href="/web.html">👥</a>
<a href="#">⚙️</a>
<a href="/logout.html">🔒</a>
</nav>
</header>
<main>
<aside class="sidebar">
<h2>Chat Rooms</h2>
<ul>
<li><a href="#">General</a></li>
<li><a href="#">Development</a></li>
<li><a href="#">Support</a></li>
<li><a href="#">Random</a></li>
</ul>
</aside>
{% extends "app.html" %}
{% block main %}
<chat-window class="chat-area"></chat-window>
</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 = 'inline-block'
});
;
</script>
</body>
</html>
{% endblock %}

View File

@ -46,6 +46,11 @@ class RPCView(BaseView):
await self.services.socket.subscribe(self.ws,subscription["channel_uid"])
return record
async def search_user(self, query):
self._require_login()
return [user['username'] for user in await self.services.user.search(query)]
async def get_user(self, user_uid):
self._require_login()
if not user_uid: