Added private chat.
This commit is contained in:
parent
3f75c8d5f9
commit
8a59ddd210
@ -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(
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 %}
|
||||
|
@ -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) => {
|
||||
|
@ -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()
|
||||
return web.HTTPFound("/channel/{}.html".format(channel["uid"]))
|
||||
else:
|
||||
if channel:
|
||||
return web.HTTPFound("/channel/{}.html".format(channel["uid"]))
|
||||
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()
|
||||
|
Loading…
Reference in New Issue
Block a user