import random import operator import json configFileName = "kukconfig.json" people = {} class Person(object): global people def __init__(self, name): self.name = name self.kukPoints = 0 people[name] = self @classmethod def fromFile(self, name, kukPoints): person = Person(name) person.kukPoints = kukPoints @staticmethod def get(name): if name not in people: people[name] = Person(name) return people[name] @staticmethod def leaderboard(): leaderboard = [] for name,person in people.iteritems(): entry = {} entry['name'] = name entry['score'] = person.kukPoints leaderboard.append(entry) leaderboard.sort(key=lambda tup : tup['score'], reverse = True) return leaderboard def serialized(self): return self.__dict__ mealHistory = {} class Meal(object): global mealHistory def __init__(self): self.mid = '' self.kuk = '' self.eaters = [] self.date = '' self.flavorText = '' self.accounted = "" @classmethod def fromFile(self, mid, kuk, eaters, date, flavorText, accounted): meal = Meal() meal.mid = mid meal.kuk = kuk meal.eaters = eaters meal.date = date meal.flavorText = flavorText meal.accounted = accounted mealHistory[meal.mid] = meal return meal @classmethod def new(self, date): meal = Meal() meal.mid = self.getNextMID() meal.date = date meal.accounted = "no" mealHistory[meal.mid] = meal return meal def account(self): if self.accounted != "no": return "ERROR! this meal has already been accounted for or is broken!" self.accounted = "yes" eaterCount = len(self.eaters) points = config['points'][eaterCount] print "kuk {} clears {} points".format(self.kuk, points) Person.get(self.kuk).kukPoints -= points for eater in self.eaters: Person.get(eater).kukPoints += points / eaterCount print "+{} gets {} points ".format(eater, points / eaterCount) @staticmethod def getNextMID(): if len(mealHistory) == 0: return 1 return max(mealHistory.keys())+1 def serialized(self): return self.__dict__ def save(): with open(config['mealHistoryFile'], 'w') as outfile: mealListJson = [] for mid,meal in mealHistory.iteritems(): mealListJson.append(meal.serialized()) json.dump(mealListJson, outfile) with open(config['peopleFile'], 'w') as outfile: peopleJson = [] for name,person in people.iteritems(): peopleJson.append(person.serialized()) json.dump(peopleJson, outfile) def load(): mealHistory = {} people = {} try: with open(config['mealHistoryFile'], 'r') as infile: fileData = json.load(infile) except: print "no meal history file!" return for meal in fileData: Meal.fromFile(meal['mid'], meal['kuk'], meal['eaters'], meal['date'], meal['flavorText'], meal['accounted']) try: with open(config['peopleFile'], 'r') as infile: fileData = json.load(infile) except: print "no people file!" return for person in fileData: Person.fromFile(person['name'], person['kukPoints']) kukPointTable = {} # points[3] = 52 # points[4] = 69 # points[5] = 80 # points[6] = 90 # points[7] = 102 # points[8] = 112 # points[9] = 120 # points[10] = 135 newcommers = ["Rick", "Morty", "Jerry", "Mr Poopy Buthole", "Karl Gustav VII", "Erik"] day = 1 def newDay(): global day important = ['delicious', 'fabulous', 'very tasty', 'good', 'very good', 'not bad at all', 'favorable', 'ok', 'nutritious', 'italian', 'mouth-watering', 'objectively pleasing', 'aromatic', 'something to write home about', 'probably digestible', 'edible', 'a complex blend of carbon-based chemistry','not sanitized"); DROP TABLE MEALS;--', 'not poisoned', 'of unknown origin', 'crunchy', 'finger-licking good', 'fantastic', 'the best one we had so far', 'fancy', 'extrordinary', 'pleasant'] if len(newcommers) > 0 and random.random() < 0.1: newbe = Person(newcommers.pop()) newbe.attendanceRate = 0.2 + random.random() * 0.8 print "### NEW MEMBER ###" print "!!! {} has joined the group !!!" n_people = 0 while n_people < 3: attendees = [] for name, person in people.iteritems(): if random.random() < person.attendanceRate: attendees.append(name) n_people = len(attendees) print "\n\n===Day {}===".format(str(day)) print "{} people comming: ".format(str(n_people)) print " ", for name in attendees: print name + ",", print "" #selecting the kuk cookies = [v for k,v in people.iteritems() if k in attendees] scookies = sorted(cookies, key=operator.attrgetter('kukPoints'), reverse=True) tied = [] for person in scookies: if person.kukPoints < scookies[0].kukPoints: break tied.append(person) if len(tied)==1: print "{} has the most points ({}) and is going to cook".format(tied[0].name, str(tied[0].kukPoints)) kuk = tied[0] else: print "{} people are tied with {} points each".format(str(len(tied)), str(tied[0].kukPoints)) print " ", for person in tied: print person.name + ",", print "" kuk = random.choice(tied) print "{} was selected at random and is going to cook".format(kuk.name) cookies.remove(kuk) #kuking and points m = Meal.new(day); m.kuk = kuk.name reward = points[n_people] payment = points[n_people] / (n_people-1) kuk.kukPoints -= reward kuk.kukMealCount += 1 kuk.kukServingCount += n_people kuk.eatenCount += 1 for cookie in cookies: cookie.kukPoints += payment cookie.eatenCount += 1 m.eaters.append(cookie.name) print "" print "{} cooked for {} people and cleared {} KukPoints".format(kuk.name, n_people, reward) print "{} people gained {} KukPoints each".format(n_people-1, payment) print "The meal was {}!".format(random.choice(important[:day])) day = day+1 if __name__ == '__main__': try: with open (configFileName, 'r') as configFile: config = json.load(configFile) except IOError: print "Config file not found! Loading defaults" config = {} config['ip'] = '127.0.0.1' config['port'] = 5000 config['debug'] = True config['mealHistoryFile'] = "MealHistory.json" config['peopleFile'] = "People.json" # Person('Davide') # Person('Marek') # Person('Sven') # Person('Wille') # Person('Ahmed') # Person('David') # m = Meal.new('8-10-2017') # m.kuk = 'Marek' # m.eaters.append('Davide') # m.eaters.append('Sven') # m.eaters.append('Wille')