BuildPlay / create_games /create_games_slack.py
Kim Adams
adding handlers to openai responses
a2627f1
import pandas as pd
import openai, json
from collections import Counter
from random import choice
from utilities import constants
INPUT_DATAPATH = "slack_processing/data/themes.json"
OUTPUT_GAME_IDEAS_DATAPATH="create_games/data/game_ideas.json"
themes = []
themes_by_person={}
people_by_theme = {}
players=[]
def ReadThemesFromFile():
global themes
with open(INPUT_DATAPATH, "r") as json_file:
themes = json.load(json_file)
def PopulateThemesByPerson():
global themes, themes_by_person
themes_by_person = {}
for theme in themes:
person = theme['person']
postId = theme['postId']
theme_info = (theme['theme'], postId)
themes_by_person.setdefault(person, set()).add(theme_info)
def PopulatePeopleByThemes():
global themes, people_by_theme
people_by_theme = {}
for theme in themes:
person = theme['person']
theme_name = theme['theme']
people_by_theme.setdefault(theme_name, set()).add(person)
def FindCommonTheme(people_set):
global themes_by_person, people_by_theme
theme_counter = Counter()
for person in people_set:
if person in themes_by_person:
unique_themes = set(theme for theme, _ in themes_by_person[person])
for theme in unique_themes:
theme_counter[theme] += 1
# Case 1: Theme shared by all people
for theme, count in theme_counter.items():
if count == len(people_set):
print("case 1: shared by all", theme)
return theme
# Case 2: Theme shared by most people
print('theme_counter', theme_counter)
if theme_counter:
# Find the highest frequency among themes
max_count = theme_counter.most_common(1)[0][1]
# Gather all themes with that frequency
most_common_themes = [theme for theme, count in theme_counter.items() if count == max_count]
# Randomly choose among them
most_common_theme = choice(most_common_themes)
print("case 2: shared by most", most_common_theme)
return most_common_theme
# Case 3: Most popular theme
if people_by_theme:
most_popular_theme, _ = Counter({theme: len(people) for theme, people in people_by_theme.items()}).most_common(1)[0]
print("case 3: most_popular_theme", most_popular_theme)
return most_popular_theme
else:
return None
def Completion(messages):
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=messages
)
return response["choices"][0]["message"]["content"]
def GenerateGameIdeas(common_topic, group, gameType):
prompt=None
if gameType==constants.CHAT:
prompt = f"""Given this game topic '{common_topic}', create a chat-based game that a player can play against YOU via chat interface. Refer to yourself as BuildBot. Provide 1-2 Tips, example questions to get players started (Tip=Ask about color). Include 1-3 Rules that explain how to play. Keep answers short. Answer must be in JSON, in this format: {{"Name":"Name of game", "Description":"Game rules", "Type":"Draw or Chat", "Rules":"Some rules for the game.", "Tips":"String of 1-2 questions to get players started", "InitialQuestion":"Pose the first question that starts the game."}}"""
elif gameType==constants.DRAW:
prompt = f"""Given this game topic '{common_topic}', create a drawing-based game where a player draws a single thing. Include 1-3 simple rules for how to play and the first thing for them to draw (InitialQuestion). Keep answers short. Answer must be in JSON, in this format: {{"Name": "Name of game", "Description": "Game rules", "Rules": "Some rules for the game.", "Tips": "String of 1-2 questions to get players started","InitialQuestion": "Tell the player what to draw first."}}"""
messages=[]
messages.append({"role": "system", "content": prompt})
game_data = Completion(messages)
# Process the response and extract the game ideas
game_ideas = []
errorMsg=None
try:
game_data_dict = json.loads(game_data)
game_ideas.append(game_data_dict)
except json.JSONDecodeError:
errorMsg="Error decoding JSON."
if game_ideas:
with open(OUTPUT_GAME_IDEAS_DATAPATH, 'w') as file:
json.dump(game_ideas, file, indent=4)
return game_ideas, None
else:
if not errorMsg == None:
return None, errorMsg
print("No game idea found.")
return None, None
def GetPlayersAndIndex():
players = []
index = 0
for theme in themes:
person = theme['person']
if person not in [t[0] for t in players]:
players.append((person, index))
index += 1
return players
def GetPlayers():
players = []
for theme in themes:
person = theme['person']
if person not in players:
players.append((person))
return players
def GetPeopleByThemesDF():
global people_by_theme
flattened_data = [(theme, person) for theme, persons in people_by_theme.items() for person in persons]
# Create a DataFrame
df = pd.DataFrame(flattened_data, columns=['Theme', 'Person'])
return df
def MostCommonTheme():
global people_by_theme
return max(people_by_theme, key=lambda k: len(people_by_theme[k]))
def LoadThemes():
global themes,people_by_theme, themes_by_person, players
ReadThemesFromFile()
PopulatePeopleByThemes()
PopulateThemesByPerson()
def CreateGameForGroup(group, gameType, retry=False):
global themes,themes_by_person
if not retry:
common_topic = FindCommonTheme(group)
else:
common_topic = MostCommonTheme()
ideas,error = GenerateGameIdeas(common_topic, group, gameType)
if ideas is None or not ideas:
if not retry:
retry=True
players=GetPlayers()
return CreateGameForGroup(players, gameType, retry)
else:
return None, None
else:
if error is not None:
print("Error: ", error)
return None, error
print('above df, ideas: ', ideas)
gDF=pd.DataFrame(ideas)
return gDF,common_topic