Beispiel #1
0
    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,
        }
Beispiel #2
0
    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,
            }]
        })
Beispiel #3
0
    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,
        })
Beispiel #4
0
    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
                    }
                },
            ]
        })
Beispiel #5
0
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
Beispiel #6
0
    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
Beispiel #7
0
    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