From 488b7ee1233aefbb7bb70ee5958676f852139025 Mon Sep 17 00:00:00 2001 From: Bobby Date: Wed, 17 May 2023 20:15:08 -0400 Subject: Protected usernames + Skippy comes to chat to lonely users + Handle Multiple Chat users --- chat/ai.py | 18 ++++++++++++++++ chat/chat_cache.py | 43 +++++++++++++++++++++++++++++++++++++ chat/consumers.py | 63 +++++++++++++++++++++++++++++------------------------- 3 files changed, 95 insertions(+), 29 deletions(-) create mode 100644 chat/ai.py create mode 100644 chat/chat_cache.py (limited to 'chat') diff --git a/chat/ai.py b/chat/ai.py new file mode 100644 index 00000000..494f6357 --- /dev/null +++ b/chat/ai.py @@ -0,0 +1,18 @@ + +import redis +from .chat_cache import get_user_messages, save_user_messages + +r = redis.Redis(host='localhost', port=6379, db=0) +subsequent_message = "I told you, no one's around. Stop talking to yourself, you weirdo!" + +def invokeMFSkippy(message, identifier): + save_user_messages(user_identifier=identifier, message={'content': message, 'role': 'user'}) + user_messages = get_user_messages(user_identifier=identifier) + if len(user_messages) == 1: + return "Skippy here. No one's around, you lonely rat!" + elif len(user_messages) == 2: + return "I told you, no one's around. Stop talking to yourself, you weirdo!" + elif len(user_messages) == 3: + return "I'm not going to respond to you anymore. Not only are you a weirdo, you're also relentlesslly annoying." + else: + return None \ No newline at end of file diff --git a/chat/chat_cache.py b/chat/chat_cache.py new file mode 100644 index 00000000..08cbf178 --- /dev/null +++ b/chat/chat_cache.py @@ -0,0 +1,43 @@ +import redis +import json + +r = redis.Redis(host='localhost', port=6379, db=0) + +def handle_connect(): + # increase number of connected users + r.set('n_connected_lc_users', max(1, int(r.get('n_connected_lc_users')) + 1)) + print('There are now {} connected users.'.format(r.get('n_connected_lc_users'))) + +def handle_disconnect(): + # decrease number of connected users + r.set('n_connected_lc_users', max(0, int(r.get('n_connected_lc_users')) - 1)) + print('There are now {} connected users.'.format(r.get('n_connected_lc_users'))) + +def handle_alone_user(): + if int(r.get('n_connected_lc_users')) == 1: + return True + else: + return False + +def save_user_messages(user_identifier, message): + # get user_messages from redis + user_messages = r.get(user_identifier) + if user_messages: + user_messages = json.loads(user_messages) + else: + user_messages = [] + # append new message + user_messages.append(message) + # save user_messages to redis + r.set(user_identifier, json.dumps(user_messages)) + +def get_user_messages(user_identifier): + # get user_messages from redis + user_messages = r.get(user_identifier) + if user_messages: + return json.loads(user_messages) + else: + return [] + +def discard_user_messages(user_identifier): + r.delete(user_identifier) \ No newline at end of file diff --git a/chat/consumers.py b/chat/consumers.py index be1cf265..5b0e7ddf 100644 --- a/chat/consumers.py +++ b/chat/consumers.py @@ -1,40 +1,45 @@ import json -from channels.generic.websocket import WebsocketConsumer -from asgiref.sync import async_to_sync +from channels.generic.websocket import AsyncWebsocketConsumer +from .chat_cache import handle_connect, handle_disconnect, handle_alone_user, discard_user_messages +from .ai import invokeMFSkippy -class ChatConsumer(WebsocketConsumer): - def connect(self): +class ChatConsumer(AsyncWebsocketConsumer): + async def connect(self): self.room_group_name = 'chat' - async_to_sync(self.channel_layer.group_add)( - self.room_group_name, - self.channel_name - ) - self.accept() + await self.channel_layer.group_add(self.room_group_name, self.channel_name) + await self.accept() + handle_connect() + + async def disconnect(self, close_code): + # Leave room group + await self.channel_layer.group_discard(self.room_group_name, self.channel_name) + handle_disconnect() + discard_user_messages(user_identifier=self.channel_name) - def receive(self, text_data): + async def receive(self, text_data): text_data_json = json.loads(text_data) message = text_data_json['message'] username = text_data_json['username'] - async_to_sync(self.channel_layer.group_send)( - self.room_group_name, - { - 'type': 'chat', - 'message': message, - 'username': username - } + + # Send message to room group + await self.channel_layer.group_send( + self.room_group_name, {"type": "chat", "message": message, "username": username} ) + is_alone_user = handle_alone_user() + if is_alone_user: + bot_response = invokeMFSkippy(message=message, identifier=self.channel_name) + if bot_response: + await self.channel_layer.group_send( + self.room_group_name, {"type": "chat", "message": bot_response, "username": "Skippy"} + ) + else: + discard_user_messages(user_identifier=self.channel_name) - def chat(self, event): - message = event['message'] - username = event['username'] - self.send(text_data=json.dumps({ - 'message': message, - 'username': username - })) + # Receive message from room group + async def chat(self, event): + message = event["message"] + username = event["username"] - def disconnect(self, close_code): - async_to_sync(self.channel_layer.group_discard)( - self.room_group_name, - self.channel_name - ) + # Send message to WebSocket + await self.send(text_data=json.dumps({"message": message, "username": username})) -- cgit v1.2.3