diff --git a/mo/util.py b/mo/util.py index a72c5bd6fdf34800d2c58501adec3d719c18aa32..10c2d63896d8f70cb31de877a5a4ced9458a4e7f 100644 --- a/mo/util.py +++ b/mo/util.py @@ -13,7 +13,7 @@ import re import secrets import subprocess import sys -from typing import Any, Optional, NoReturn, Tuple +from typing import Any, Optional, NoReturn, Tuple, List import textwrap import urllib.parse @@ -247,3 +247,24 @@ def check_points(points: decimal.Decimal, for_task: Optional[db.Task] = None, fo else: return f'Podle nastavení kola zadat body jen s krokem {points_step} (hodnota {points} je neplatná)' return None + + +def parse_int_list(a: str, maxim: int = 200) -> List[int]: + """Parsuje "1-3,5,7-9" na [1,2,3,5,7,9]. + Aby nešlo generovat moc velká pole (obrana proti DDoSu), + existuje omezení na velikost.""" + r: List[int] = [] + for i in a.split(","): + b = i.split("-") + if len(b) > 2: + raise mo.CheckError("Nadměrný počet pomlček") + try: + c = list(map(int, b)) + except ValueError: + raise mo.CheckError("Převod na číslo se nezdařil") + if any(x < 0 or x > maxim for x in c): + raise mo.CheckError("Překročen limit na velikost čísla") + if len(c) == 2 and c[0] > c[1]: + raise mo.CheckError("Větší číslo nemůže být před menším") + r += [c[0]] if len(c) == 1 else range(c[0], c[1] + 1) + return r