Esempio n. 1
0
    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
            })
Esempio n. 2
0
 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()
Esempio n. 3
0
    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
            })
Esempio n. 4
0
    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
            })