diff --git a/bots/client_bot.py b/bots/client_bot.py index c9e1f8d..9c3da0c 100644 --- a/bots/client_bot.py +++ b/bots/client_bot.py @@ -44,14 +44,39 @@ def _md_escape(text: str) -> str: return ''.join(result) +def _display_width(s: str) -> int: + w = 0 + for ch in s: + cp = ord(ch) + if (0x0400 <= cp <= 0x04FF or 0x0500 <= cp <= 0x052F or + 0x2E80 <= cp <= 0x9FFF or 0xF900 <= cp <= 0xFAFF or + 0xFE30 <= cp <= 0xFE4F): + w += 2 + else: + w += 1 + return w + + +def _pad_col(s: str, width: int) -> str: + cur = _display_width(s) + if cur >= width: + return s + return s + ' ' * (width - cur) + + def format_pairings(pairings_data: dict, tournament_name: str) -> str: pairings = pairings_data['pairings'] rnd = pairings_data['round'] + w_name, w_pts = 28, 5 + border = '─┼─'.join('─' * w for w in [4, w_name, w_pts]) lines = [ f'*{_md_escape(tournament_name)}*', f'πŸ“‹ *Π’ΡƒΡ€ {rnd}* β€” ΠΏΠ°Ρ€Ρ‹', '', + '```', + f'{_pad_col("#", 4)} β”‚ {_pad_col("Π˜Π³Ρ€ΠΎΠΊ", w_name)} β”‚ {_pad_col("О", w_pts)}', + border, ] board = 1 @@ -61,7 +86,14 @@ def format_pairings(pairings_data: dict, tournament_name: str) -> str: p1, p2, color = pairing if color == 'bye': - lines.append(f'{board}\\. {_md_escape(p1.name)} β€” BYE') + lines.append( + f'{_pad_col(str(board), 4)} β”‚ {_pad_col(p1.name, w_name)} β”‚ ' + f'{_pad_col(str(p1.points), w_pts)}' + ) + lines.append( + f'{_pad_col("", 4)} β”‚ {_pad_col("β€” BYE β€”", w_name)} β”‚ ' + f'{_pad_col("", w_pts)}' + ) board += 1 continue @@ -71,15 +103,17 @@ def format_pairings(pairings_data: dict, tournament_name: str) -> str: white, black = p2, p1 lines.append( - f'{board}\\. {_md_escape(white.name)} ' - f'\\({_md_escape(f"{white.points:.1f}")}\\)' + f'{_pad_col(str(board), 4)} β”‚ {_pad_col(white.name, w_name)} β”‚ ' + f'{_pad_col(f"{white.points:.1f}", w_pts)}' ) lines.append( - f' {_md_escape(black.name)} ' - f'\\({_md_escape(f"{black.points:.1f}")}\\)' + f'{_pad_col("", 4)} β”‚ {_pad_col(black.name, w_name)} β”‚ ' + f'{_pad_col(f"{black.points:.1f}", w_pts)}' ) board += 1 + lines.append('```') + source = pairings_data.get('source', 'algorithm') if source == 'bbp_pairings_fide_2025': lines.append('\n_FIDE 2025 \(bbpPairings\)_')