Added private chat.

This commit is contained in:
retoor 2025-02-11 15:34:31 +01:00
parent 3f75c8d5f9
commit 8a59ddd210
6 changed files with 144 additions and 12 deletions

View File

@ -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(

View File

@ -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

View File

@ -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

View File

@ -14,7 +14,7 @@
<ul>
{% for user in users %}
<li>
<a href="/user/{{user.username.value}}">{{user.username.value}}</a>
<a href="/channel/{{user.uid.value}}.html">{{user.username.value}}</a>
</li>
{% endfor %}

View File

@ -15,12 +15,12 @@
<chat-window style="display:none" class="chat-area"></chat-window>
<div class="chat-input">
<textarea placeholder="Type a message..." rows="2"></textarea>
<upload-button channel="{{ channel.channel_uid.value }}"></upload-button>
<upload-button channel="{{ channel.uid.value }}"></upload-button>
</div>
</section>
<script>
const channelUid = "{{ channel.channel_uid.value }}";
const channelUid = "{{ channel.uid.value }}";
function initInputField(textBox) {
textBox.addEventListener('change', (e) => {

View File

@ -31,22 +31,44 @@ class WebView(BaseView):
login_required = True
async def get(self):
if self.login_required and not self.session.get("logged_in"):
return web.HTTPFound("/")
channel = await self.services.channel.get(uid=self.request.match_info.get("channel"))
if not channel:
user = await self.services.user.get(uid=self.request.match_info.get("channel"))
if user:
channel = await self.services.channel.get_dm(self.session.get("uid"), user["uid"])
if not channel:
return web.HTTPNotFound()
user = await self.services.user.get(uid=self.session.get("uid"))
messages = [await self.app.services.channel_message.to_extended_dict(message) for message in await self.app.services.channel_message.offset(
channel["uid"]
)]
return await self.render_template("web.html", {"channel": channel,"user": user,"messages": messages})
async def get2(self):
if self.login_required and not self.session.get("logged_in"):
return web.HTTPFound("/")
channel = None
if not self.request.match_info.get("channel"):
channel = await self.app.services.channel.get(
tag="public",deleted_at=None
)
if not channel:
return web.HTTPNotFound()
if channel:
return web.HTTPFound("/channel/{}.html".format(channel["uid"]))
else:
if not channel:
print(self.request.match_info.get("channel"), flush=True)
channel = await self.app.services.channel.get(
uid=str(self.request.match_info.get("channel")),deleted_at=None
uid=str(self.request.match_info.get("channel"))
)
if channel:
print(f'found {channel["uid"]} {channel["name"]}', flush=True)
if not channel:
name = "#" + str(self.request.match_info.get("channel")).lstrip("#")
@ -56,16 +78,77 @@ class WebView(BaseView):
channel = await self.app.services.channel.get(
label=name,deleted_at=None
)
if not channel:
user = await self.app.services.user.get(uid=self.request.match_info.get("channel"))
if not user:
print("HIERRR EXIT\n",flush=True)
return web.HTTPNotFound()
print("FOUND USer: ",user['username'],flush=True)
own_channels = self.app.services.channel_member.find(
user_uid=self.session.get("uid"),deleted_at=None
)
user_channels = self.app.services.channel_member.find(
user_uid=user['uid'],deleted_at=None
)
found_channel = False
async for user_channel in user_channels:
if found_channel:
break
async for own_channel in own_channels:
if user_channel["channel_uid"] == own_channel["channel_uid"]:
channel = await self.app.services.channel.get(uid=user_channel["channel_uid"])
if channel['tag'] == 'dm':
found_channel = True
print("FOUND DM\n",flush=True)
break
channel = None
else:
print("Channel mistmatch!\n",flush=True)
if found_channel:
print(f"FOUND CHANNEL; {channel['uid']}\n",flush=True)
return web.HTTPFound("/channel/{}.html".format(channel["uid"]))
channel = await self.app.services.channel.create(
label="Direct Message",
created_by_uid=self.session.get("uid"),
tag="dm",
description="Direct Chat",
is_private=True,
is_listed=True
)
print(f"UID NEW CHANNELr: {channel['uid']}\n",flush=True)
channel_member_self = await self.app.services.channel_member.create(
channel_uid=channel['uid'],
user_uid=self.session.get("uid"),
is_moderator=True
)
print(f"UID NEW CHANNEL_MEMBER SELF: {channel_member_self['uid']}\n",flush=True)
channel_member_user = await self.app.services.channel_member.create(
channel_uid=channel['uid'],
user_uid=user["uid"],
is_moderator=True
)
print(f"UID NEW CHANNEL_MEMBER USER: {channel_member_user['uid']}\n",flush=True)
self.app.db.commit()
print(f"REDIRECT NAAR GOEDE: {channel['uid']}\n",flush=True)
return web.HTTPFound("/channel/{}.html".format(channel["uid"]))
if not channel:
print("NOT found!\n",flush=True)
return web.HTTPNotFound()
print(channel['uid'],":",self.session.get('uid'),flush=True)
from pprint import pprint as pp
pp(channel)
channel_member = await self.app.services.channel_member.get(
channel_uid=channel["uid"], user_uid=self.session.get("uid"),deleted_at=None,is_banned=False
channel_uid=channel["uid"], user_uid=self.session.get("uid"),deleted_at=None
)
if not channel_member:
print("NO CHANNEL_MEMBER")
return web.HTTPNotFound()
print("HIER\n",flush=True)
print("UUID=",self.session.get("uid"),flush=True)
user = await self.app.services.user.get(uid=self.session.get("uid"))
if not user:
return web.HTTPNotFound()