from flask import Flask, request, jsonify, render_template import random import string from flask_cors import CORS import smtplib import bcrypt import openai from better_profanity import profanity app = Flask(__name__) CORS(app) # Buffered Caches rooms = {} room_data = {} started_rooms = {} complete = {} openai.api_key='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' def generate_room_code(): return ''.join(random.choices(string.ascii_uppercase, k=6)) @app.route('/create-room', methods=['POST']) def create_room(): room_code = generate_room_code() rooms[room_code] = {'players': [], 'started': False, 'process': 0, 'generated': False, 'story_content': '', 'reactions': 0, 'chats': [], 'pollCount': 0} player_name = request.json.get('name') if not player_name: return {'error': 'Player name is required'} # Add the player to the room. player_id = len(rooms[room_code]['players']) + 1 rooms[room_code]['players'].append({'id': player_id, 'name': player_name}) return {'room_code': room_code} @app.route('/join-room/', methods=['POST', 'GET']) def join_room(room_code): if request.method == 'POST': if room_code not in rooms: return {'noRoom': True} if len(rooms[room_code]['players']) >= 5: return {'error': 'Room is full'} player_name = request.json.get('name') if not player_name: return {'error': 'Player name is required'} # Add the player to the room. player_id = len(rooms[room_code]['players']) + 1 rooms[room_code]['players'].append({'id': player_id, 'name': player_name}) return {'player_id': player_id, 'players': rooms[room_code]['players']} if request.method == 'GET': if room_code not in rooms: return {'noRoom': True} ready = False if len(rooms[room_code]['players']) == 5: # do it <= 5 ready = True return {'players': rooms[room_code]['players'], 'ready': ready, 'started': rooms[room_code]['started'], 'meta_data': rooms[room_code]} @app.route('/start-room/', methods=['POST']) def start_room(room_code): if room_code not in rooms: return {'error': 'Room not found'} rooms[room_code]['started'] = True rooms[room_code]['process'] = 0 return {'success': True} @app.route('/handle-tokens//', methods=['POST', 'GET']) def handle_tokens(room_code, player_id): if request.method == 'POST': if room_code not in rooms: return {'error': 'Room not found'} data = request.get_json() word = data['word'] genres = data['genres'] additional_changes = data['additionalChanges'] rooms[room_code]['players'] = [ {**player, 'word': word, 'genres': genres, 'additional_changes': additional_changes} if player[ 'id'] == player_id else player for player in rooms[room_code]['players']] rooms[room_code]['process'] += 1 if rooms[room_code]['process'] == 5: process(room_code) return jsonify({'success': True, 'process': True}) print(rooms[room_code]['players']) print(rooms[room_code]['process']) return {'success': True, 'process': False} if request.method == 'GET': if room_code not in rooms: return jsonify({'error': 'Room not found'}) processed = False generated = False if rooms[room_code]['process'] == 5: processed = True if rooms[room_code]['generated']: generated = True return {'process': processed, 'generated': generated} @app.route('/leave-room//', methods=['POST']) def leave_room(room_code, player_id): if room_code not in rooms: return {'error': 'Room not found'} rooms[room_code]['players'] = [player for player in rooms[room_code]['players'] if player['id'] != player_id] if player_id == 1 or not rooms[room_code]['players']: del rooms[room_code] return {'message': 'Player has left the room'} def process(room_code): if room_code not in rooms: return {'error': 'Room not found'} players = rooms[room_code]['players'] # Initialize variables to store aggregated data room_data[room_code] = { 'word_data': {}, 'additional_changes': '' } for player in players: player_id = player['id'] # Store word data for each player room_data[room_code]['word_data'][f'word {player_id}'] = player['word'] # Aggregate additional_changes if room_data[room_code]['additional_changes']: room_data[room_code]['additional_changes'] += ' ' + player['additional_changes'] else: room_data[room_code]['additional_changes'] = player['additional_changes'] # Find the most repeated genre in the room # genre_counts = {} # for player in players: # for genre in player['genres']: # genre_counts[genre] = genre_counts.get(genre, 0) + 1 # most_repeated_genre = max(genre_counts, key=genre_counts.get) # room_data[room_code]['most_repeated_genre'] = most_repeated_genre genre_counts = {} for player in players: for genre in player['genres']: if genre in genre_counts: genre_counts[genre] += 1 else: genre_counts[genre] = 1 most_repeated_genre = '' maxct = 0 for key, value in genre_counts.items(): if maxct < value: most_repeated_genre = key maxct = value room_data[room_code]['most_repeated_genre'] = most_repeated_genre print(room_data) @app.route('/generate-story/', methods=['POST']) def generate_story(room_code): if room_code not in rooms: return {'error': 'Room not found'} data = request.get_json() word_limit = data.get('wordLimit') word_data = room_data[room_code]['word_data'] additional_context = room_data[room_code]['additional_changes'] genre = room_data[room_code]['most_repeated_genre'] words = '' ct = 0 for key, value in word_data.items(): ct += 1 if ct < len(word_data): words += (value + ', ') else: words += value if len(additional_context.split()) >= 250: additional_context = '' prompt = 'Keyword: ' + str(words) + '.' + 'Genres: ' + str(genre) + '.' + 'Additional Context: ' + str( additional_context) + '.' + 'Word Limit: ' + str(word_limit) + '.' print(prompt) profanity.load_censor_words() if profanity.contains_profanity(prompt): return {'success': False, 'message': 'Content is improper.'} conversation = [ {"role": "system", "content": "You are a creative storyteller. User will give atmost 5 Keywords along with genres and additional context for the story. Also user will mention the word limit for the story."}, {"role": "user", "content": prompt} ] response = openai.ChatCompletion.create( model='gpt-3.5-turbo', messages=conversation, temperature=0.7, n=1 ) story = response['choices'][0]['message']['content'] rooms[room_code]['generated'] = True rooms[room_code]['story_content'] = story print(rooms[room_code]) complete[room_code] = rooms[room_code] return {'success': True, 'storyContent': story} @app.route('/reaction-true/', methods=['GET']) def reaction_true(room_code): rooms[room_code]['reactions'] += 1 return {'success': True, 'likeCount': rooms[room_code]['reactions']} @app.route('/reaction-false/', methods=['GET']) def reaction_false(room_code): rooms[room_code]['reactions'] -= 1 return {'success': True, 'likeCount': rooms[room_code]['reactions']} @app.route('/room-chat/', methods=['GET']) def room_chat(room_code): if room_code not in rooms: return {'success': False, 'error': 'Room not found'} print(rooms[room_code]['chats']) return {'success': True, 'chats': rooms[room_code]['chats'], 'pollCount': rooms[room_code]['pollCount']} @app.route('/chat-input//', methods=['POST']) def chat_input(room_code, player_id): data = request.get_json() if room_code not in rooms: return {'success': False, 'error': 'Room not found'} rooms[room_code]['chats'].append({'id': player_id, 'text': data.get('text')}) return {'success': True} @app.route('/poll-data/', methods=['POST']) def poll_count(room_code): if room_code not in rooms: return jsonify({'success': False, 'error': 'Room not found'}) rooms[room_code]['pollCount'] += 1 return {'success': True, 'pollCount': rooms[room_code]['pollCount']} @app.route('/complete/', methods=['GET']) def completed(room_code): if room_code not in rooms: return {'success': False, 'error': 'Room not found'} return complete[room_code] @app.route('/list-rooms', methods=['GET']) def list_rooms(): room_info = {} for room_code, player in rooms.items(): room_info[room_code] = len(player['players']) return {'roomInfo': room_info} if __name__ == '__main__': app.run()