From 84e5bac1b93d5d1c124d303e6b08a29baaf4977c Mon Sep 17 00:00:00 2001 From: retoor Date: Wed, 29 Jan 2025 00:33:00 +0100 Subject: [PATCH] New padding. --- src/snek/model/user.py | 8 +++++++- src/snek/service/__init__.py | 2 ++ src/snek/service/chat.py | 1 + src/snek/service/user.py | 6 ++++++ src/snek/static/message-list.js | 4 ++++ src/snek/static/models.js | 4 +++- src/snek/system/mapper.py | 1 + src/snek/view/login.py | 7 +++++-- src/snek/view/register.py | 2 +- src/snek/view/rpc.py | 13 ++++++++++--- src/snek/view/status.py | 1 + 11 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/snek/model/user.py b/src/snek/model/user.py index 97070c4..f611d6a 100644 --- a/src/snek/model/user.py +++ b/src/snek/model/user.py @@ -12,11 +12,17 @@ class UserModel(BaseModel): ) nick = ModelField( name="nick", - required=False, + required=True, min_length=2, max_length=20, regex=r"^[a-zA-Z0-9_]+$", ) + color = ModelField( + name ="color", + required=True, + regex=r"^#[0-9a-fA-F]{6}$", + kind=str + ) email = ModelField( name="email", required=False, diff --git a/src/snek/service/__init__.py b/src/snek/service/__init__.py index 6a8f76c..97fbaae 100644 --- a/src/snek/service/__init__.py +++ b/src/snek/service/__init__.py @@ -7,6 +7,7 @@ from snek.service.chat import ChatService from snek.service.notification import NotificationService from snek.service.socket import SocketService from snek.service.user import UserService +from snek.service.util import UtilService from snek.system.object import Object @@ -21,6 +22,7 @@ def get_services(app): "chat": ChatService(app=app), "socket": SocketService(app=app), "notification": NotificationService(app=app), + "util": UtilService(app=app), } ) diff --git a/src/snek/service/chat.py b/src/snek/service/chat.py index 74ca94e..fcbf0bc 100644 --- a/src/snek/service/chat.py +++ b/src/snek/service/chat.py @@ -19,6 +19,7 @@ class ChatService(BaseService): sent_to_count = await self.services.socket.broadcast(channel_uid, dict( message=message, user_uid=user_uid, + color=user['color'], channel_uid=channel_uid, created_at=channel_message["created_at"], updated_at=None, diff --git a/src/snek/service/user.py b/src/snek/service/user.py index 60825a5..eb14ee7 100644 --- a/src/snek/service/user.py +++ b/src/snek/service/user.py @@ -13,11 +13,17 @@ class UserService(BaseService): return False return True + async def save(self, user): + if not user['color']: + user['color'] = await self.services.util.random_light_hex_color() + return await super().save(user) + async def register(self, email, username, password): if await self.exists(username=username): raise Exception("User already exists.") model = await self.new() model["nick"] = username + model['color'] = await self.services.util.random_light_hex_color() model.email.value = email model.username.value = username model.password.value = await security.hash(password) diff --git a/src/snek/static/message-list.js b/src/snek/static/message-list.js index 71b6b7c..0850a25 100644 --- a/src/snek/static/message-list.js +++ b/src/snek/static/message-list.js @@ -20,6 +20,7 @@ class MessageListElement extends HTMLElement { createElement(message){ const element = document.createElement("div") element.dataset.uid = message.uid + element.dataset.color = message.color element.dataset.channel_uid = message.channel_uid element.dataset.user_nick = message.user_nick element.dataset.created_at = message.created_at @@ -28,11 +29,13 @@ class MessageListElement extends HTMLElement { element.classList.add("message") const avatar = document.createElement("div") avatar.classList.add("avatar") + avatar.style.backgroundColor = message.color avatar.innerText = message.user_nick[0] const messageContent = document.createElement("div") messageContent.classList.add("message-content") const author = document.createElement("div") author.classList.add("author") + author.style.color = message.color author.textContent = message.user_nick const text = document.createElement("div") text.classList.add("text") @@ -60,6 +63,7 @@ class MessageListElement extends HTMLElement { message.channel_uid, message.user_uid, message.user_nick, + message.color, message.message, message.created_at, message.updated_at diff --git a/src/snek/static/models.js b/src/snek/static/models.js index 6589279..a28262a 100644 --- a/src/snek/static/models.js +++ b/src/snek/static/models.js @@ -5,11 +5,13 @@ class MessageModel { created_at = null updated_at = null element = null - constructor(uid, channel_uid,user_uid,user_nick, message,created_at, updated_at){ + color = null + constructor(uid, channel_uid,user_uid,user_nick, color,message,created_at, updated_at){ this.uid = uid this.message = message this.user_uid = user_uid this.user_nick = user_nick + this.color = color this.channel_uid = channel_uid this.created_at = created_at this.updated_at = updated_at diff --git a/src/snek/system/mapper.py b/src/snek/system/mapper.py index 9722534..d7e4163 100644 --- a/src/snek/system/mapper.py +++ b/src/snek/system/mapper.py @@ -48,6 +48,7 @@ class BaseMapper: async def save(self, model: BaseModel) -> bool: if not model.record.get("uid"): raise Exception(f"Attempt to save without uid: {model.record}.") + model.updated_at.update() return self.table.upsert(model.record, ["uid"]) async def find(self, **kwargs) -> typing.AsyncGenerator: diff --git a/src/snek/view/login.py b/src/snek/view/login.py index c9904f5..db5be55 100644 --- a/src/snek/view/login.py +++ b/src/snek/view/login.py @@ -16,9 +16,12 @@ class LoginView(BaseFormView): async def submit(self, form): if await form.is_valid: - user = await self.services.user.get(username=form.username.value,deleted_at=None) + user = await self.services.user.get(username=form['username'],deleted_at=None) + # Migrate data + await self.services.user.save(user) self.session["logged_in"] = True - self.session["username"] = form.username.value + self.session["username"] = user['username'] self.session["uid"] = user["uid"] + self.session["color"] = user["color"] return {"redirect_url": "/web.html"} return {"is_valid": False} diff --git a/src/snek/view/register.py b/src/snek/view/register.py index eb1c8d8..c29d855 100644 --- a/src/snek/view/register.py +++ b/src/snek/view/register.py @@ -22,5 +22,5 @@ class RegisterView(BaseFormView): self.request.session["uid"] = result["uid"] self.request.session["username"] = result["username"] self.request.session["logged_in"] = True - + self.request.session["color"] = result["color"] return {"redirect_url": "/web.html"} diff --git a/src/snek/view/rpc.py b/src/snek/view/rpc.py index 514db45..d4ed660 100644 --- a/src/snek/view/rpc.py +++ b/src/snek/view/rpc.py @@ -14,13 +14,19 @@ class RPCView(BaseView): self.user_uid = self.view.session.get("uid") self.ws = ws - + async def get_user(self, user_uid): + if not user_uid: + user_uid = self.user_uid + user = await self.services.user.get(uid=user_uid) + record = user.record + del record['password'] + del record['deleted_at'] + del record['email'] + return record async def get_messages(self, channel_uid,offset=0): messages = [] async for message in self.services.channel_message.query("SELECT * FROM channel_message ORDER BY created_at DESC LIMIT 30"): #"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)}): - print("JEEEHHH\n",flush=True) - user = await self.services.user.get(uid=message["user_uid"]) if not user: print("User not found!",flush= True) @@ -28,6 +34,7 @@ class RPCView(BaseView): messages.insert(0,dict( uid=message["uid"], + color=user['color'], user_uid=message["user_uid"], channel_uid=message["channel_uid"], user_nick=user['nick'], diff --git a/src/snek/view/status.py b/src/snek/view/status.py index a307dee..04ea4d9 100644 --- a/src/snek/view/status.py +++ b/src/snek/view/status.py @@ -33,6 +33,7 @@ class StatusView(BaseView): "email": user["email"], "nick": user["nick"], "uid": user["uid"], + "color": user['color'], "memberships": memberships, }