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 @@ 🏠 🔍 - 👥 + 👥 ⚙️ 🔒