From 8a59ddd210bb3ab3d29f9207afbf887988b528d9 Mon Sep 17 00:00:00 2001 From: retoor Date: Tue, 11 Feb 2025 15:34:31 +0100 Subject: [PATCH] Added private chat. --- src/snek/service/channel.py | 35 +++++++++++ src/snek/service/channel_member.py | 16 ++++- src/snek/system/service.py | 2 +- src/snek/templates/search_user.html | 2 +- src/snek/templates/web.html | 4 +- src/snek/view/web.py | 97 ++++++++++++++++++++++++++--- 6 files changed, 144 insertions(+), 12 deletions(-) diff --git a/src/snek/service/channel.py b/src/snek/service/channel.py index e169d7c..5291189 100644 --- a/src/snek/service/channel.py +++ b/src/snek/service/channel.py @@ -6,6 +6,27 @@ from snek.system.model import now class ChannelService(BaseService): mapper_name = "channel" + async def get( + self, + uid=None, + **kwargs): + if uid: + kwargs['uid'] = uid + result = await super().get(**kwargs) + if result: + return result + del kwargs['uid'] + kwargs['name'] = uid + result = await super().get(**kwargs) + if result: + return result + kwargs['name'] = '#' + uid + result = await super().get(**kwargs) + if result: + return result + return None + return await super().get(**kwargs) + async def create( self, label, @@ -31,6 +52,20 @@ class ChannelService(BaseService): return model raise Exception(f"Failed to create channel: {model.errors}.") + async def get_dm(self, user1, user2): + channel_member = await self.services.channel_member.get_dm( + user1, user2 + ) + if channel_member: + return await self.get(uid=channel_member["channel_uid"]) + channel = await self.create( + "DM", user1, tag="DM" + ) + await self.services.channel_member.create_dm( + channel["uid"], user1, user2 + ) + return channel + async def get_users(self, channel_uid): users = [] async for channel_member in self.services.channel_member.find( diff --git a/src/snek/service/channel_member.py b/src/snek/service/channel_member.py index 6b9ce9e..f3ced31 100644 --- a/src/snek/service/channel_member.py +++ b/src/snek/service/channel_member.py @@ -16,7 +16,7 @@ class ChannelMemberService(BaseService): ): model = await self.get(channel_uid=channel_uid, user_uid=user_uid) if model: - if model.is_banned.value: + if model['is_banned']: return False return model model = await self.new() @@ -32,3 +32,17 @@ class ChannelMemberService(BaseService): if await self.save(model): return model raise Exception(f"Failed to create channel member: {model.errors}.") + + async def get_dm(self,from_user, to_user): + async for model in self.query("SELECT channel_member.* FROM channel_member INNER JOIN channel ON (channel.uid = channel_member.channel_uid and channel.tag = 'dm') INNER JOIN channel_member AS channel_member2 ON(channel_member2.channel_uid = channel.uid AND channel_member2.user_uid = :to_user) WHERE channel_member.user_uid=:from_user " ,dict(from_user=from_user, to_user=to_user)): + return model + return None + + async def create_dm(self,channel_uid, from_user_uid, to_user_uid): + result = await self.create(channel_uid, from_user_uid,tag="dm") + await self.create(channel_uid, to_user_uid,tag="dm") + return result + + + + diff --git a/src/snek/system/service.py b/src/snek/system/service.py index a088854..d65f947 100644 --- a/src/snek/system/service.py +++ b/src/snek/system/service.py @@ -40,7 +40,7 @@ class BaseService: if uid: if not kwargs: result = await self.cache.get(uid) - if result: + if False and result and result.__class__ == self.mapper.model_class: return result kwargs["uid"] = uid diff --git a/src/snek/templates/search_user.html b/src/snek/templates/search_user.html index ba5b51b..8bce656 100644 --- a/src/snek/templates/search_user.html +++ b/src/snek/templates/search_user.html @@ -14,7 +14,7 @@