def receive(self, text_data): text_data_json = json.loads(text_data) content = text_data_json.get('content') room_pk = text_data_json.get('room_id') user_pk = text_data_json.get('user_id') match = re.match(r'^/stock=([A-Z]*)$', content) if match: tasks.query_quote.delay(match.group(1), room_pk) else: room = Room.objects.get(pk=room_pk) user = User.objects.get(pk=user_pk) message = Message() message.content = content message.room = room message.user = user message.save() datetime = message.datetime.isoformat() user_name = user.username async_to_sync(self.channel_layer.group_send)(self.group_name, { 'type': 'send_message', 'datetime': datetime, 'content': content, 'room_pk': room_pk, 'user_pk': user_pk, 'user_name': user_name })
def handle(self, *args, **options): if options['room'] and options['from'] and options['text']: msg = Message() msg.room = options['room'] msg.sender = options['from'] msg.content = options['text'] msg.save()
async def receive_json(self, data): user = self.scope['user'] type = data['type'] if type == 'chat_message': text = data['text'] if not text: logger.warning(f'A user tried to send an empty message to room "{self.room.id}"') return if len(text) > 200: logger.warning(f'A user tried to send a too long message to room ({self.room.id}') return if not user.is_authenticated: logger.warning(f'An unauthenticated user tried to send the message "{text}" to room "{self.room.id}"') return message = Message() message.user = user message.text = text message.room = self.room await database_sync_to_async(lambda: message.save())() await self.channel_layer.group_send( str(self.room.id), { 'type': 'chat_message', 'id': message.id, 'text': message.text, 'user_id': str(message.user.id), 'user_username': user.username, 'created_at': message.created_at.isoformat() } ) if self.room.public: return # notify the other user about a new private message await database_sync_to_async(lambda: self.notify_chat_partner(user, message, data['gameId'], data['fromHouse']))() if type == 'chat_view_message': message_id = data['message_id'] if not self.user_in_room: logger.warning(f'An unauthenticated used tried to mark a message as viewed in room "{self.room.id}"') message = await database_sync_to_async(lambda: Message.objects.get(id=message_id))() if not message: logger.warning(f'A user tried to mark a non-existent message (id: {message_id}) as viewed (user_id: {self.user_in_room.user.id})') self.user_in_room.last_viewed_message = message await database_sync_to_async(lambda: self.user_in_room.save())() elif type == 'chat_retrieve': count = data['count'] first_message_id = data['first_message_id'] if first_message_id is not None: first_message = await database_sync_to_async(lambda: Message.objects.get(id=first_message_id))() first_message_created_at = await database_sync_to_async(lambda: first_message.created_at)() else: first_message_created_at = None if self.room.max_retrieve_count is not None: count = min(self.room.max_retrieve_count, count) messages = await database_sync_to_async(lambda: self.get_and_transform_messages(count, first_message_created_at))() # Also include the last message viewed in the response last_viewed_message = self.user_in_room.last_viewed_message if first_message_id is None and self.user_in_room else None await self.send_json({ 'type': 'chat_messages_retrieved' if first_message_id is None else 'more_chat_messages_retrieved', 'messages': messages, 'last_viewed_message': last_viewed_message.id if last_viewed_message else None })
async def receive_json(self, data): user = self.scope['user'] type = data['type'] if type == 'chat_message': text = data['text'] if not text: logger.warning( f'A user tried to send an empty message to room "{self.room.id}"' ) return if len(text) > 200: logger.warning( f'A user tried to send a too long message to room ({self.room.id}' ) return if not user.is_authenticated: logger.warning( f'An unauthenticated user tried to send the message "${text}" to room "{self.room.id}"' ) return message = Message() message.user = user message.text = text message.room = self.room await database_sync_to_async(lambda: message.save())() await self.channel_layer.group_send( str(self.room.id), { 'type': 'chat_message', 'id': message.id, 'text': message.text, 'user_id': str(message.user.id), 'user_username': user.username, 'created_at': message.created_at.isoformat() }) if type == 'chat_view_message': message_id = data['message_id'] if not self.user_in_room: logger.warning( f'An unauthenticated used tried to mark a message as viewed in room "{self.room.id}"' ) message = await database_sync_to_async( lambda: Message.objects.get(id=message_id))() if not message: logger.warning( f'A user tried to mark a non-existent message (id: {message_id}) as viewed (user_id: {self.user_in_room.user.id})' ) self.user_in_room.last_viewed_message = message await database_sync_to_async(lambda: self.user_in_room.save())() elif type == 'chat_retrieve': count = count = data['count'] if self.room.max_retrieve_count is not None: count = min(self.room.max_retrieve_count, count) messages = await database_sync_to_async(lambda: reversed( Message.objects.filter(room=self.room).prefetch_related('user') .order_by('-created_at')[:count]))() # Also include the last message viewed in the response last_viewed_message = self.user_in_room.last_viewed_message if self.user_in_room else None await self.send_json({ 'type': 'chat_messages_retrieved', 'messages': [{ 'id': message.id, 'text': message.text, 'user_id': str(message.user.id), 'user_username': message.user.username, 'created_at': message.created_at.isoformat() } for message in messages], 'last_viewed_message': last_viewed_message.id if last_viewed_message else None })