def index(request): if request.method == "GET": lastSeenId = int(request.GET.get('lastSeenId', '0')) messages = Message.objects.all().filter( id__gt=lastSeenId).order_by('id') POPMessages = map( lambda m: { 'id': m.id, 'sender': m.sender, 'body': m.body }, messages[0:1000]) return JsonResponse({'messages': list(POPMessages)}) if request.method == "POST": sender = request.POST.get('sender', None) body = request.POST.get('body', None) if sender is None or body is None: return JsonResponse("Sender and Body are required fields", status=400) message = Message(sender=sender, body=body) message.save() # Limit total messages messages = Message.objects.all().order_by('id') count = messages.count() diff = count - settings.CHAT_MAX_MESSAGES if diff > 0: for i in range(diff): message = messages[0] message.delete() return JsonResponse({'status': 'Ok'})
def msg_consumer(message): # Save to model #room = message.content['room'] data = json.loads(message.content['message']) username = data.get('username') msg = data.get('message') user = User.objects.filter(username=username).first() print('msg=> ', message.content) message_to_return = json.loads(message.content['message']) if data.get('action') == 'create': msg_obj = Message() msg_obj.sender_user = user msg_obj.message = msg msg_obj.save() message_to_return["id"] = msg_obj.id message_to_return["creation_date"] = datetime.datetime.strftime( msg_obj.creation_date, '%Y-%m-%d %H:%M:%S') if data.get('action') == 'delete': msg_obj = Message.objects.filter(id=data.get('id')).first() msg_obj.delete() # Broadcast to listening sockets message_to_return["action"] = data.get('action') Group('chat').send({'text': json.dumps(message_to_return)})
async def command(self, cmd): """ Run chat command """ app = self.request.app app.logger.debug(f'Chat command {cmd}') if cmd.startswith('/kill'): # unconnect user from room try: target = cmd.split(' ')[1] peer = app.wslist[self.room.id][target] await self.disconnect(target, peer, silent=True) app.logger.debug(f'User {target} killed') except KeyError: pass elif cmd == '/clear': # drop all room messages count = await app.objects.execute( Message.delete().where(Message.room == self.room)) app.logger.debug(f'Removed {count} messages') for peer in app.wslist[self.room.id].values(): peer.send_json({'cmd': 'empty'}) elif cmd == '/help': return { 'text': dedent('''\ - /help - display this msg - /kill {username} - remove user from room - /clear - empty all messages in room ''') } else: return {'text': 'wrong cmd {cmd}'}