Example #1
0
    def get(self):

        members = Member.query(Member.active == True).order(Member.username)

        #Identify the slackers for future shaming
        double_list = []
        kill_tracker = []

        for person in members:

            if person.double < 0:
                double_list.append(person)

            kill_list = person.kill_list
            logging.debug("Type of kill_list: " + str(type(kill_list)))

            kills7 = sum(kill_list[23:])
            kills14 = sum(kill_list[16:])
            kills30 = sum(kill_list)

            kill_dict = {
                'name': person.username,
                'kills7': kills7,
                'kills14': kills14,
                'kills30': kills30
            }

            kill_tracker.append(kill_dict)

        template = JINJA_ENVIRONMENT.get_template('admin.html')
        self.response.write(
            template.render(kills=kill_tracker, double=double_list))
Example #2
0
    def get(self):

        root_url = 'https://lyrania.co.uk/api/accounts/public_profile.php?'
        memberlist = []

        members = Member.query(Member.active == True).order(Member.username)

        for member in members:

            #Form URL
            params = {'search': str(member.key.id())}
            encoded_params = urllib.urlencode(params)
            url = root_url + encoded_params

            #Fetch request and format response
            response = urlfetch.fetch(url=url, validate_certificate=True)
            result = json.loads(response.content)
            list_addition = [result]
            memberlist = memberlist + list_addition

            #Do stuff with the database HERE
            member.username = result['name']
            member.level = int(result['level'])
            member.quests = int(result['quests_complete'])
            member.base_stats = int(result['base_stats'])
            member.dp = int(result['earned_dp'])

            if result['guild_name'] != 'Phoenix':
                member.active = False

            member.put()

        #Write return
        template = JINJA_ENVIRONMENT.get_template('stats.html')
        self.response.write(template.render(data=memberlist))
Example #3
0
    def post(self):

        action = self.request.get('action')
        logging.info("Admin action: " + action)

        if action == "newcontest":

            contest_name = self.request.get('contestname')
            start_date = self.parseDate(str(self.request.get('startdate')))
            end_date = self.parseDate(str(self.request.get('enddate')))

            #If dates could not be parsed, return error.
            if start_date is None or end_date is None:
                result = "Invalid date parameters: Please use DD-MM-YYYY or YYYY-MM-DD"

            #Else proceed with database update.
            else:
                #Get a list of current members. API call unnecessary since baseline GDP won't be calculated until contest starts.
                members = Member.query(Member.active == True).order(
                    Member.username)
                score_list = []

                #Set up a ContestScore entity for each member
                for person in members:
                    new_score = ContestScore(member_id=person.key.id(),
                                             member_name=person.username,
                                             start_gdp=0,
                                             current_gdp=0)

                    score_list = score_list + [new_score]

                #Create new Contest
                new_contest = Contest(active=False,
                                      name=contest_name,
                                      start=start_date,
                                      end=end_date,
                                      scores=score_list)

                new_contest.put()
                result = "Contest " + new_contest.name + " successfully created!"

        else:
            logging.warning("Admin action: Unable to resolve action type!")
            result = "Error: Unknown action"

        #Output
        template = JINJA_ENVIRONMENT.get_template('admin_submit.html')
        self.response.write(template.render(info=result))
Example #4
0
    def get(self):
        logging.info("Starting maintenance job...")

        #Form URL
        url = 'https://lyrania.co.uk/api/guilds/member_list.php?'
        params = {'api_code': GUILD_SECRET}
        encoded_params = urllib.urlencode(params)
        url = url + encoded_params

        #Fetch request and format response
        response = urlfetch.fetch(url=url, validate_certificate=True)
        result = json.loads(response.content)
        contest_additions = []

        #[START UPDATE GUILD CONTRIBUTIONS]

        for member in result['members']:
            #Attempt to fetch this member from the DB
            candidate_key = try_key(member['id'])
            entry = candidate_key.get()

            #If member not found, create a new one and set aside for addition to ongoing contests
            if entry is None:
                logging.info("New member detected: " + member['username'])

                kill_tracker = []

                for x in xrange(0, 29):
                    kill_tracker.append(0)

                kill_tracker.append(
                    int(member['kills']['kills']) -
                    int(member['kills']['yesterdays_kills']))

                infant_member = Member(
                    id=member['id'],
                    username=member['username'],
                    rank="0",
                    active=True,
                    level=int(member['level']),
                    kills=int(member['kills']['kills']),
                    quests=0,
                    base_stats=0,
                    buffed_stats=0,
                    dp=0,
                    xp=int(member['donations']['exp_donated']),
                    xp_prev=0,
                    food=int(member['donations']['food']),
                    food_prev=0,
                    stone=int(member['donations']['stone']),
                    stone_prev=0,
                    iron=int(member['donations']['iron']),
                    iron_prev=0,
                    lumber=int(member['donations']['lumber']),
                    lumber_prev=0,
                    gems=int(member['donations']['gems']),
                    gems_prev=0,
                    money=int(member['donations']['money']),
                    money_prev=0,
                    jade=int(member['donations']['jade']),
                    jade_prev=0,
                    double=int(member['donations']['double']),
                    gdp=int(member['gdp']['dp']),
                    gdp_prev=0,
                    gdp_spent=int(member['gdp']['dp_spent']),
                    gdp_spent_prev=0,
                    weekly_gdp=int(member['gdp']['weekly_dp']),
                    last_weekly_gdp=int(member['gdp']['last_weekly_dp']),
                    rp=int(member['rp']['donated']),
                    rp_prev=0,
                    chc=0,
                    chd=0,
                    heroism=0,
                    leadership=0,
                    archaeology=0,
                    jc=0,
                    serendipity="",
                    epeen=0,
                    w1=0,
                    w2=0,
                    a1=0,
                    a2=0,
                    a3=0,
                    a4=0,
                    a5=0,
                    a6=0,
                    a7=0,
                    kill_list=kill_tracker)

                infant_member.put()
                new_member = [member['id']]
                contest_additions = contest_additions + new_member

            #Otherwise, update the existing entry
            else:
                entry.username = member['username']
                entry.active = True
                entry.level = int(member['level'])
                entry.kills = int(member['kills']['kills'])
                entry.xp = int(member['donations']['exp_donated'])
                entry.food = int(member['donations']['food'])
                entry.stone = int(member['donations']['stone'])
                entry.iron = int(member['donations']['iron'])
                entry.lumber = int(member['donations']['lumber'])
                entry.gems = int(member['donations']['gems'])
                entry.money = int(member['donations']['money'])
                entry.jade = int(member['donations']['jade'])
                entry.double = int(member['donations']['double'])
                entry.gdp = int(member['gdp']['dp'])
                entry.gdp_spent = int(member['gdp']['dp_spent'])
                entry.weekly_gdp = int(member['gdp']['weekly_dp'])
                entry.last_weekly_gdp = int(member['gdp']['last_weekly_dp'])
                entry.rp = int(member['rp']['donated'])

                kill_tracker = entry.kill_list

                yesterdays_kills = int(member['kills']['kills']) - int(
                    member['kills']['yesterdays_kills'])

                kill_tracker.append(yesterdays_kills)
                kill_tracker = kill_tracker[1:]
                entry.kill_list = kill_tracker

                #Update the database
                entry.put()

        #[END UPDATE GUILD CONTRIBUTIONS]
        #[START UPDATE STATS]

        root_url = 'https://lyrania.co.uk/api/accounts/public_profile.php?'
        memberlist = []

        members = Member.query(Member.active == True).order(Member.username)

        for person in members:

            #Form URL
            params = {'search': str(person.key.id())}
            encoded_params = urllib.urlencode(params)
            url = root_url + encoded_params

            #Fetch request and format response
            response = urlfetch.fetch(url=url, validate_certificate=True)
            result = json.loads(response.content)
            list_addition = [result]
            memberlist = memberlist + list_addition

            #Do stuff with the database HERE
            person.username = result['name']
            person.level = int(result['level'])
            person.quests = int(result['quests_complete'])
            person.base_stats = int(result['base_stats'])
            person.dp = int(result['earned_dp'])

            #If no longer a member, inactivate and store off previous stats
            if result['guild_name'] != 'Phoenix':
                logging.info("Member no longer in guild: " + person.username)
                person.active = False
                person.xp_prev = person.xp
                person.money_prev = person.money
                person.jade_prev = person.jade
                person.gems_prev = person.gems
                person.food_prev = person.food
                person.iron_prev = person.iron
                person.stone_prev = person.stone
                person.lumber_prev = person.lumber
                person.gdp_prev = person.gdp
                person.gdp_spent_prev = person.gdp_spent
                person.rp_prev = person.rp

            person.put()

        #[END UPDATE STATS]
        #[START UPDATE CONTESTS]

        #Get today and also yesterday, since contests up until yesterday are relevant
        today = datetime.date.today()
        date_adjust = datetime.timedelta(days=-1)
        yesterday = today + date_adjust

        contest_list = Contest.query(Contest.end >= yesterday)

        if contest_list is None:
            logging.info("No active contests")

        else:
            for item in contest_list:
                logging.info("Updating contest: " + item.name)

                if item.start <= today and item.end >= today:
                    item.active = True
                else:
                    item.active = False

                for score in item.scores:
                    candidate_key = try_key(score.member_id)
                    this_member = candidate_key.get()

                    if this_member is not None:
                        score.current_gdp = this_member.gdp
                        score.member_name = this_member.username

                        if item.start == today:
                            score.start_gdp = this_member.gdp

                    else:
                        logging.warning("Unable to retrieve member: " +
                                        score.member_name)

                for addition in contest_additions:
                    candidate_key = try_key(addition)
                    entity = candidate_key.get()

                    if entity is not None:
                        new_score = ContestScore(member_id=entity.key.id(),
                                                 member_name=entity.username,
                                                 start_gdp=entity.gdp,
                                                 current_gdp=entity.gdp)

                        item.scores = item.scores + [new_score]

                    else:
                        logging.warning("Unable to add contest addition: " +
                                        str(addition))

                item.put()