From d71d5da6bcf22d2daf5ec59832f15fe02472b95c Mon Sep 17 00:00:00 2001
From: retoor <retoor@molodetz.nl>
Date: Tue, 8 Apr 2025 04:20:28 +0200
Subject: [PATCH] Updates.

---
 pyproject.toml                      |  2 +-
 src/snek/app.py                     | 13 +++++++------
 src/snek/model/user.py              | 22 ++++++++++++++++++++++
 src/snek/service/__init__.py        |  3 ++-
 src/snek/static/app.js              |  2 +-
 src/snek/static/base.css            |  5 +----
 src/snek/templates/search_user.html |  2 ++
 src/snek/templates/threads.html     |  3 +++
 8 files changed, 39 insertions(+), 13 deletions(-)

diff --git a/pyproject.toml b/pyproject.toml
index 6fbf200..62c1ac7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -16,7 +16,7 @@ requires-python = ">=3.12"
 dependencies = [
     "mkdocs>=1.4.0",
     "lxml",
-
+    "IPython",
     "shed",
     "app @ git+https://retoor.molodetz.nl/retoor/app",
     "beautifulsoup4",
diff --git a/src/snek/app.py b/src/snek/app.py
index 25913b9..ead9ff8 100644
--- a/src/snek/app.py
+++ b/src/snek/app.py
@@ -85,12 +85,18 @@ class Application(BaseApplication):
         self.jinja2_env.add_extension(EmojiExtension)
 
         self.setup_router()
-
+        self.executor = None
         self.cache = Cache(self)
         self.services = get_services(app=self)
         self.mappers = get_mappers(app=self)
+        self.on_startup.append(self.prepare_asyncio)
         self.on_startup.append(self.prepare_database)
 
+    async def prepare_asyncio(self,app):
+        #app.loop = asyncio.get_running_loop()
+        app.executor = ThreadPoolExecutor(max_workers=200)
+        app.loop.set_default_executor(self.executor)   
+
     async def create_task(self, task):
         await self.tasks.put(task)
 
@@ -235,11 +241,6 @@ class Application(BaseApplication):
         return await super().render_template(template, request, context)
 
 
-executor = ThreadPoolExecutor(max_workers=200)
-
-loop = asyncio.get_event_loop()
-loop.set_default_executor(executor)
-
 app = Application(db_path="sqlite:///snek.db")
 
 
diff --git a/src/snek/model/user.py b/src/snek/model/user.py
index a35d890..89d46ba 100644
--- a/src/snek/model/user.py
+++ b/src/snek/model/user.py
@@ -29,6 +29,28 @@ class UserModel(BaseModel):
 
     last_ping = ModelField(name="last_ping", required=False, kind=str)
 
+    async def get_property(self, name):
+        prop = await self.app.services.user_property.find_one(
+            user_uid=self["uid"], name=name
+        )
+        if prop:
+            return prop["value"]
+
+    async def has_property(self, name):
+        return await self.app.services.user_property.exists(
+            user_uid=self["uid"], name=name
+        )
+
+    async def set_property(self, name, value):
+        if not await self.has_property(name):
+            await self.app.services.user_property.insert(
+                user_uid=self["uid"], name=name, value=value
+            )
+        else:
+            await self.app.services.user_property.update(
+                user_uid=self["uid"], name=name, value=value
+            )
+
     async def get_channel_members(self):
         async for channel_member in self.app.services.channel_member.find(
             user_uid=self["uid"], is_banned=False, deleted_at=None
diff --git a/src/snek/service/__init__.py b/src/snek/service/__init__.py
index 4059f77..f491e9b 100644
--- a/src/snek/service/__init__.py
+++ b/src/snek/service/__init__.py
@@ -11,7 +11,7 @@ from snek.service.socket import SocketService
 from snek.service.user import UserService
 from snek.service.util import UtilService
 from snek.system.object import Object
-
+from snek.service.user_property import UserPropertyService
 
 @functools.cache
 def get_services(app):
@@ -27,6 +27,7 @@ def get_services(app):
             "util": UtilService(app=app),
             "drive": DriveService(app=app),
             "drive_item": DriveItemService(app=app),
+            "user_property": UserPropertyService(app=app),
         }
     )
 
diff --git a/src/snek/static/app.js b/src/snek/static/app.js
index 95e5bc4..0517ff9 100644
--- a/src/snek/static/app.js
+++ b/src/snek/static/app.js
@@ -233,4 +233,4 @@ export class App extends EventHandler {
 }
 
 export const app = new App();
-window.app = app;
\ No newline at end of file
+window.app = app;
diff --git a/src/snek/static/base.css b/src/snek/static/base.css
index 7384ad7..f009c71 100644
--- a/src/snek/static/base.css
+++ b/src/snek/static/base.css
@@ -374,15 +374,12 @@ a {
         left: 0;
             text-overflow: ellipsis;
         width:100%;
-        *{
-            font-size: 12px !important;
-        }
         .logo {
             text-overflow: ellipsis;
             white-space: nowrap;
             overflow: hidden;
             h2 {
-                font-size: 12px;
+                font-size: 14px;
             }
         }
         
diff --git a/src/snek/templates/search_user.html b/src/snek/templates/search_user.html
index cf35d0d..4aad6eb 100644
--- a/src/snek/templates/search_user.html
+++ b/src/snek/templates/search_user.html
@@ -2,6 +2,8 @@
 
 {% block title %}Search{% endblock %}
 
+{% block header_text %}<h2 style="color:#fff">Search</h2>{% endblock %}
+
 {% block main %}
 
 <section class="chat-area">
diff --git a/src/snek/templates/threads.html b/src/snek/templates/threads.html
index ae71c6f..d534df6 100644
--- a/src/snek/templates/threads.html
+++ b/src/snek/templates/threads.html
@@ -1,7 +1,10 @@
 {% extends "app.html" %}
 
+{% block header_text %}<h2 style="color:#fff">Threads</h2>{% endblock %}
+
 {% block main %}
 <section class="chat-area" id="chat">
+    <div class="chat-header">&nbsp;</div>
     <div class="threads">
         {% for thread in threads %}
         {% autoescape false %}