def _gen_award_data(cls, challenge, solve, solve_num): award_points = challenge.first_blood_bonus[solve_num - 1] if ( solve_num - 1) < len(challenge.first_blood_bonus) else None if award_points is None: return None return { 'user_id': solve.user.id if solve.user is not None else None, 'team_id': solve.team.id if solve.team is not None else None, 'name': '{0} blood for {1}'.format(ordinalize(solve_num), challenge.name), 'description': 'Bonus points for being the {0} to solve the challenge'.format( ordinalize(solve_num)), 'category': 'First Blood', 'date': solve.date, 'value': award_points, 'icon': 'medal-{0}'.format(ordinalize(solve_num)) if solve_num <= 3 else 'medal', 'solve_id': solve.id, 'solve_num': solve_num, }
def notify_solve(self, format, solver_name, solver_url, challenge_name, challenge_url, solve_num): markdown_msg = format.format( solver='[{solver_name}]({solver_url})'.format(solver_name=solver_name, solver_url=solver_url), challenge='[{challenge_name}]({challenge_url})'.format(challenge_name=challenge_name, challenge_url=challenge_url), solve_num=ordinalize(solve_num), ) requests.post(self.get_webhook_url(), json={ 'embeds': [{ 'description': markdown_msg, }] })
def notify_solve(self, format, solver_name, solver_url, challenge_name, challenge_url, solve_num): markdown_msg = format.replace('(', '\\(').replace(')', '\\)').format( solver='[{solver_name}]({solver_url})'.format(solver_name=self._escape(solver_name), solver_url=self._escape(solver_url)), challenge='[{challenge_name}]({challenge_url})'.format(challenge_name=self._escape(challenge_name), challenge_url=self._escape(challenge_url)), solve_num=ordinalize(solve_num), ) requests.post('https://api.telegram.org/bot{bot_token}/sendMessage'.format(bot_token=self.get_bot_token()), json={ 'chat_id': self.get_chat_id(), 'parse_mode': 'MarkdownV2', 'text': markdown_msg, })
def notify_solve(self, format, solver_name, solver_url, challenge_name, challenge_url, solve_num): plain_msg = format.format( solver=solver_name, challenge=challenge_name, solve_num=ordinalize(solve_num), ) markdown_msg = format.format( solver='<{solver_url}|{solver_name}>'.format(solver_name=solver_name, solver_url=solver_url), challenge='<{challenge_url}|{challenge_name}>'.format(challenge_name=challenge_name, challenge_url=challenge_url), solve_num=ordinalize(solve_num), ) requests.post(self.get_webhook_url(), json={ 'text': plain_msg, 'blocks': [ { "type": "section", "text": { "type": "mrkdwn", "text": markdown_msg } }, ] })
def test_ordinalize(): tests = { 1: "1st", 2: "2nd", 3: "3rd", 4: "4th", 11: "11th", 12: "12th", 13: "13th", 101: "101st", 102: "102nd", 103: "103rd", 111: "111th", } for t, v in list(tests.items()): assert ordinalize(t) == v
def get_place(self, admin=False, numeric=False): """ This method is generally a clone of CTFd.scoreboard.get_standings. The point being that models.py must be self-reliant and have little to no imports within the CTFd application as importing from the application itself will result in a circular import. """ from CTFd.utils.scores import get_team_standings standings = get_team_standings(admin=admin) try: n = standings.index((self.id,)) + 1 if numeric: return n return ordinalize(n) except ValueError: return None
def get_place(self, admin=False, numeric=False): """ This method is generally a clone of CTFd.scoreboard.get_standings. The point being that models.py must be self-reliant and have little to no imports within the CTFd application as importing from the application itself will result in a circular import. """ from CTFd.utils.scores import get_team_standings standings = get_team_standings(admin=admin) for i, team in enumerate(standings): if team.team_id == self.id: n = i + 1 if numeric: return n return ordinalize(n) else: return None