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):
|
class ChannelService(BaseService):
|
||||||
mapper_name = "channel"
|
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(
|
async def create(
|
||||||
self,
|
self,
|
||||||
label,
|
label,
|
||||||
@ -31,6 +52,20 @@ class ChannelService(BaseService):
|
|||||||
return model
|
return model
|
||||||
raise Exception(f"Failed to create channel: {model.errors}.")
|
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):
|
async def get_users(self, channel_uid):
|
||||||
users = []
|
users = []
|
||||||
async for channel_member in self.services.channel_member.find(
|
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)
|
model = await self.get(channel_uid=channel_uid, user_uid=user_uid)
|
||||||
if model:
|
if model:
|
||||||
if model.is_banned.value:
|
if model['is_banned']:
|
||||||
return False
|
return False
|
||||||
return model
|
return model
|
||||||
model = await self.new()
|
model = await self.new()
|
||||||
@ -32,3 +32,17 @@ class ChannelMemberService(BaseService):
|
|||||||
if await self.save(model):
|
if await self.save(model):
|
||||||
return model
|
return model
|
||||||
raise Exception(f"Failed to create channel member: {model.errors}.")
|
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 uid:
|
||||||
if not kwargs:
|
if not kwargs:
|
||||||
result = await self.cache.get(uid)
|
result = await self.cache.get(uid)
|
||||||
if result:
|
if False and result and result.__class__ == self.mapper.model_class:
|
||||||
return result
|
return result
|
||||||
kwargs["uid"] = uid
|
kwargs["uid"] = uid
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<ul>
|
<ul>
|
||||||
{% for user in users %}
|
{% for user in users %}
|
||||||
<li>
|
<li>
|
||||||
<a href="/user/{{user.username.value}}">{{user.username.value}}</a>
|
<a href="/channel/{{user.uid.value}}.html">{{user.username.value}}</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -15,12 +15,12 @@
|
|||||||
<chat-window style="display:none" class="chat-area"></chat-window>
|
<chat-window style="display:none" class="chat-area"></chat-window>
|
||||||
<div class="chat-input">
|
<div class="chat-input">
|
||||||
<textarea placeholder="Type a message..." rows="2"></textarea>
|
<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>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
const channelUid = "{{ channel.channel_uid.value }}";
|
const channelUid = "{{ channel.uid.value }}";
|
||||||
|
|
||||||
function initInputField(textBox) {
|
function initInputField(textBox) {
|
||||||
textBox.addEventListener('change', (e) => {
|
textBox.addEventListener('change', (e) => {
|
||||||
|
@ -31,22 +31,44 @@ class WebView(BaseView):
|
|||||||
login_required = True
|
login_required = True
|
||||||
|
|
||||||
async def get(self):
|
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"):
|
if self.login_required and not self.session.get("logged_in"):
|
||||||
return web.HTTPFound("/")
|
return web.HTTPFound("/")
|
||||||
|
|
||||||
|
channel = None
|
||||||
|
|
||||||
if not self.request.match_info.get("channel"):
|
if not self.request.match_info.get("channel"):
|
||||||
channel = await self.app.services.channel.get(
|
channel = await self.app.services.channel.get(
|
||||||
tag="public",deleted_at=None
|
tag="public",deleted_at=None
|
||||||
)
|
)
|
||||||
if not channel:
|
if channel:
|
||||||
return web.HTTPNotFound()
|
|
||||||
return web.HTTPFound("/channel/{}.html".format(channel["uid"]))
|
return web.HTTPFound("/channel/{}.html".format(channel["uid"]))
|
||||||
else:
|
if not channel:
|
||||||
print(self.request.match_info.get("channel"), flush=True)
|
print(self.request.match_info.get("channel"), flush=True)
|
||||||
channel = await self.app.services.channel.get(
|
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:
|
if not channel:
|
||||||
|
|
||||||
name = "#" + str(self.request.match_info.get("channel")).lstrip("#")
|
name = "#" + str(self.request.match_info.get("channel")).lstrip("#")
|
||||||
@ -56,16 +78,77 @@ class WebView(BaseView):
|
|||||||
channel = await self.app.services.channel.get(
|
channel = await self.app.services.channel.get(
|
||||||
label=name,deleted_at=None
|
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:
|
if not channel:
|
||||||
print("NOT found!\n",flush=True)
|
print("NOT found!\n",flush=True)
|
||||||
return web.HTTPNotFound()
|
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_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:
|
if not channel_member:
|
||||||
|
print("NO CHANNEL_MEMBER")
|
||||||
return web.HTTPNotFound()
|
return web.HTTPNotFound()
|
||||||
|
|
||||||
print("HIER\n",flush=True)
|
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"))
|
user = await self.app.services.user.get(uid=self.session.get("uid"))
|
||||||
if not user:
|
if not user:
|
||||||
return web.HTTPNotFound()
|
return web.HTTPNotFound()
|
||||||
|
Loading…
Reference in New Issue
Block a user