from functools import wraps import random def link(uri, label=None): if label is None: label = uri parameters = '' # OSC 8 ; params ; URI ST OSC 8 ;; ST escape_mask = '\033]8;{};{}\033\\{}\033]8;;\033\\' return escape_mask.format(parameters, uri, label) class ANSICodes: DEFAULT = OFF = '\x1b[0m' BOLD = STYLE_BOLD = '\x1b[1m' DIM = STYLE_DIM = '\x1b[2m' REGULAR = STYLE_REGULAR = '\x1b[22m' ITALIC = STYLE_ITALIC = '\x1b[3m' NITALIC = STYLE_NITALIC = '\x1b[23m' UNDERLINE = DECO_UNDERLINE = '\x1b[4m' DUNDERLINE = DECO_DUNDERLINE = '\x1b[21m' NUNDERLINE = DECO_NUNDERLINE = '\x1b[24m' OVERLINE = DECO_OVERLINE = '\x1b[53m' NOVERLINE = DECO_NOVERLINE = '\x1b[55m' INVERT = DECO_INVERT = '\x1b[7m' NINVERT = DECO_NINVERT = '\x1b[27m' HIDDEN = DECO_HIDDEN = '\x1b[8m' NHIDDEN = DECO_NHIDDEN = '\x1b[28m' STRIKE = DECO_STRIKE = '\x1b[9m' NSTRIKE = DECO_NSTRIKE = '\x1b[29m' GREY = FG_GREY = '\x1b[30m' RED = FG_RED = '\x1b[31m' GREEN = FG_GREEN = '\x1b[32m' YELLOW = FG_YELLOW = '\x1b[33m' PURPLE = FG_PURPLE = '\x1b[34m' PINK = FG_PINK = '\x1b[35m' BLUE = FG_BLUE = '\x1b[36m' WHITE = FG_WHITE = '\x1b[37m' BRIGHT_GREY = FG_BRIGHT_GREY = '\x1b[90m' BRIGHT_RED = FG_BRIGHT_RED = '\x1b[91m' BRIGHT_GREEN = FG_BRIGHT_GREEN = '\x1b[92m' BRIGHT_YELLOW = FG_BRIGHT_YELLOW = '\x1b[93m' BRIGHT_PURPLE = FG_BRIGHT_PURPLE = '\x1b[94m' BRIGHT_PINK = FG_BRIGHT_PINK = '\x1b[95m' BRIGHT_BLUE = FG_BRIGHT_BLUE = '\x1b[96m' BRIGHT_WHITE = FG_BRIGHT_WHITE = '\x1b[97m' BG_GREY = '\x1b[40m' BG_RED = '\x1b[41m' BG_GREEN = '\x1b[42m' BG_YELLOW = '\x1b[43m' BG_PURPLE = '\x1b[44m' BG_PINK = '\x1b[45m' BG_BLUE = '\x1b[46m' BG_WHITE = '\x1b[47m' BG_BRIGHT_BLUE = '\x1b[100m' BG_BRIGHT_RED = '\x1b[101m' BG_BRIGHT_GREEN = '\x1b[102m' BG_BRIGHT_YELLOW = '\x1b[103m' BG_BRIGHT_PURPLE = '\x1b[104m' BG_BRIGHT_PINK = '\x1b[105m' BG_BRIGHT_BLUE = '\x1b[106m' BG_BRIGHT_WHITE = '\x1b[107m' @staticmethod def FG_CUSTOM_N(n,/): # 0- 7: standard colors (as in ESC [ 30–37 m) # 8- 15: high intensity colors (as in ESC [ 90–97 m) # 16-231: 6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5) # 232-255: grayscale from dark to light in 24 steps return f'\x1b[38;5;{n}m' @staticmethod def FG_CUSTOM_RGB(r,g,b,/): # r, g, b: 0-255 return f'\x1b[38;5;{r};{g};{b}m' @staticmethod def BG_CUSTOM_N(n,/): # 0- 7: standard colors (as in ESC [ 30–37 m) # 8- 15: high intensity colors (as in ESC [ 90–97 m) # 16-231: 6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5) # 232-255: grayscale from dark to light in 24 steps return f'\x1b[48;5;{n}m' @staticmethod def BG_CUSTOM_RGB(r,g,b,/): # r, g, b: 0-255 return f'\x1b[48;5;{r};{g};{b}m' def debugging_rand(chance): import random class RandomException(Exception): def __init__(self, *args): super().__init__(*args) if chance > 1: chance /= 100 a = random.random() if a <= chance: raise RandomException(f'RandomException {chance*100}%') def failhandler(callback, exceptions:Union[tuple, list, Exception, None]=None): if exceptions is None: exceptions = Exception def fail_decorator(func): @wraps(func) def wrapped_function(*args, **kwargs): try: return func(*args, **kwargs) except exceptions as e: callback(e,*args,**kwargs) return wrapped_function return fail_decorator