diff --git a/src/snek/app.py b/src/snek/app.py
index 6d9346d..e1f74e2 100644
--- a/src/snek/app.py
+++ b/src/snek/app.py
@@ -1,7 +1,9 @@
import pathlib
import asyncio
-import logging
+import logging
+
+from snek.view.threads import ThreadsView
logging.basicConfig(level=logging.DEBUG)
@@ -112,6 +114,7 @@ class Application(BaseApplication):
self.router.add_get("/http-photo", self.handle_http_photo)
self.router.add_get("/rpc.ws", RPCView)
self.router.add_view("/channel/{channel}.html", WebView)
+ self.router.add_view("/threads.html", ThreadsView)
self.add_subapp(
"/docs",
diff --git a/src/snek/model/channel.py b/src/snek/model/channel.py
index 8a40ced..0070948 100644
--- a/src/snek/model/channel.py
+++ b/src/snek/model/channel.py
@@ -1,3 +1,4 @@
+from snek.model.channel_message import ChannelMessageModel
from snek.system.model import BaseModel, ModelField
@@ -10,3 +11,11 @@ class ChannelModel(BaseModel):
is_listed = ModelField(name="is_listed", required=True, kind=bool, value=True)
index = ModelField(name="index", required=True, kind=int, value=1000)
last_message_on = ModelField(name="last_message_on", required=False, kind=str)
+
+ async def get_last_message(self)->ChannelMessageModel:
+ async for model in self.app.services.channel_message.query("SELECT * FROM channel_message WHERE channel_uid=:channel_uid ORDER BY created_at DESC LIMIT 1",dict(channel_uid=self['uid'])):
+ return model
+ return None
+
+ async def get_members(self):
+ return await self.app.services.channel_member.find(channel_uid=self['uid'],deleted_at=None,is_banned=False)
\ No newline at end of file
diff --git a/src/snek/model/channel_member.py b/src/snek/model/channel_member.py
index 65ba3e4..5a8332e 100644
--- a/src/snek/model/channel_member.py
+++ b/src/snek/model/channel_member.py
@@ -14,3 +14,27 @@ class ChannelMemberModel(BaseModel):
is_muted = ModelField(name="is_muted", required=True, kind=bool, value=False)
is_banned = ModelField(name="is_banned", required=True, kind=bool, value=False)
new_count = ModelField(name="new_count", required=False, kind=int, value=0)
+
+ async def get_user(self):
+ return await self.app.services.user.get(uid=self['user_uid'])
+
+ async def get_channel(self):
+ return await self.app.services.channel.get(uid=self['channel_uid'])
+
+ async def get_name(self):
+ if self["channel_uid"] == "dm":
+ user = await self.get_other_dm_user()
+ return user['nick']
+ channel = await self.get_channel()
+ return channel['name']
+
+ async def get_other_dm_user(self):
+ channel = await self.get_channel()
+ if channel["tag"] != "dm":
+ return None
+
+ async for model in self.app.services.channel_member.find(channel_uid=channel['uid']):
+ if model["uid"] != self['uid']:
+ return await self.app.services.user.get(uid=model["user_uid"])
+ return await self.get_user()
+
\ No newline at end of file
diff --git a/src/snek/model/channel_message.py b/src/snek/model/channel_message.py
index 0bda0bc..4b84fdc 100644
--- a/src/snek/model/channel_message.py
+++ b/src/snek/model/channel_message.py
@@ -1,3 +1,4 @@
+from snek.model.user import UserModel
from snek.system.model import BaseModel, ModelField
@@ -6,3 +7,9 @@ class ChannelMessageModel(BaseModel):
user_uid = ModelField(name="user_uid", required=True, kind=str)
message = ModelField(name="message", required=True, kind=str)
html = ModelField(name="html", required=False, kind=str)
+
+ async def get_user(self)->UserModel:
+ return await self.app.services.user.get(uid=self["user_uid"])
+
+ async def get_channel(self):
+ return await self.app.services.channel.get(uid=self["channel_uid"])
\ No newline at end of file
diff --git a/src/snek/model/user.py b/src/snek/model/user.py
index 54b6f30..0621ecf 100644
--- a/src/snek/model/user.py
+++ b/src/snek/model/user.py
@@ -31,3 +31,7 @@ class UserModel(BaseModel):
password = ModelField(name="password", required=True, min_length=1)
last_ping = ModelField(name="last_ping", required=False, kind=str)
+
+ 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):
+ yield channel_member
diff --git a/src/snek/service/notification.py b/src/snek/service/notification.py
index 6041901..f8a87c8 100644
--- a/src/snek/service/notification.py
+++ b/src/snek/service/notification.py
@@ -32,9 +32,9 @@ class NotificationService(BaseService):
user = await self.services.user.get(uid=channel_message["user_uid"])
async for channel_member in self.services.channel_member.find(
channel_uid=channel_message["channel_uid"],
- #is_banned=False,
- #is_muted=False,
- #deleted_at=None,
+ is_banned=False,
+ is_muted=False,
+ deleted_at=None,
):
if not channel_member['new_count']:
channel_member['new_count'] = 0
diff --git a/src/snek/system/mapper.py b/src/snek/system/mapper.py
index e57b0fa..e7415e1 100644
--- a/src/snek/system/mapper.py
+++ b/src/snek/system/mapper.py
@@ -20,7 +20,7 @@ class BaseMapper:
return self.app.db
async def new(self):
- return self.model_class(mapper=self)
+ return self.model_class(mapper=self, app=self.app)
@property
def table(self):
diff --git a/src/snek/system/model.py b/src/snek/system/model.py
index ba3fc45..1aef4ae 100644
--- a/src/snek/system/model.py
+++ b/src/snek/system/model.py
@@ -270,7 +270,8 @@ class BaseModel:
return self
def __init__(self, *args, **kwargs):
- self._mapper = None
+ self._mapper = kwargs.get("mapper")
+ self.app = kwargs.get("app")
self.fields = {}
for key in dir(self.__class__):
obj = getattr(self.__class__, key)
diff --git a/src/snek/templates/app.html b/src/snek/templates/app.html
index 185d22e..60109de 100644
--- a/src/snek/templates/app.html
+++ b/src/snek/templates/app.html
@@ -26,7 +26,7 @@
🏠
🔍
📥
- 👥
+ 👥
⚙️
🔒