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"])) |         if not channel: | ||||||
|         else: |  | ||||||
|             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