libs.utils.validator

libs/utils/validator.py

 1"""
 2libs/utils/validator.py
 3"""
 4
 5import re
 6from typing import Literal
 7
 8import libs.global_value as g
 9from cls.command import CommandParser
10from cls.timekit import ExtendedDatetime as ExtDt
11from libs.utils import formatter, textutil
12
13
14def check_namepattern(name: str, kind: Literal["member", "team"]) -> tuple[bool, str]:
15    """登録制限チェック
16
17    Args:
18        name (str): チェックする名前
19        kind (str): チェック種別
20            - member
21            - team
22
23    Returns:
24        tuple[bool, str]: 判定結果
25        - bool: 制限チェック結果真偽
26        - str: 制限理由
27    """
28
29    def _pattern_gen(check_list: list[str]) -> list[str]:
30        ret: list = []
31        for x in check_list:
32            ret.append(x)
33            ret.append(textutil.str_conv(x, "k2h"))  # ひらがな
34            ret.append(textutil.str_conv(x, "h2k"))  # カタカナ
35
36        return list(set(ret))
37
38    check_pattern = _pattern_gen([name, formatter.honor_remove(name)])  # 入力パターン
39    ret_flg: bool = True
40    ret_msg: str = "OK"
41
42    # 名前チェック
43    check_list = _pattern_gen(list(g.member_list.keys()))  # メンバーチェック
44    if ret_flg and any(x in check_list for x in check_pattern):
45        ret_flg, ret_msg = False, f"「{name}」は存在するメンバーです。"
46
47    check_list = _pattern_gen([x["team"] for x in g.team_list])  # チームチェック
48    if ret_flg and any(x in check_list for x in check_pattern):
49        ret_flg, ret_msg = False, f"「{name}」は存在するチームです。"
50
51    if ret_flg and g.cfg.member.guest_name in check_pattern:  # ゲストチェック
52        ret_flg, ret_msg = False, "使用できない名前です。"
53
54    # 登録規定チェック
55    if ret_flg and len(name) > int(getattr(g.cfg, kind).character_limit):  # 文字制限
56        ret_flg, ret_msg = False, "登録可能文字数を超えています。"
57
58    if ret_flg and re.search("[\\;:<>(),!@#*?/`\"']", name) or not name.isprintable():  # 禁則記号
59        ret_flg, ret_msg = False, "使用できない記号が含まれています。"
60
61    # 引数と同名になっていないかチェック
62    if ret_flg and name in ExtDt.valid_keywords():
63        ret_flg, ret_msg = False, "検索範囲指定に使用される単語では登録できません。"
64
65    if ret_flg and CommandParser().is_valid_command(name):
66        ret_flg, ret_msg = False, "オプションに使用される単語では登録できません。"
67
68    if ret_flg and name in set(list(g.keyword_dispatcher) + list(g.command_dispatcher)):
69        ret_flg, ret_msg = False, "コマンドに使用される単語では登録できません。"
70
71    return (ret_flg, ret_msg)
def check_namepattern(name: str, kind: Literal['member', 'team']) -> tuple[bool, str]:
15def check_namepattern(name: str, kind: Literal["member", "team"]) -> tuple[bool, str]:
16    """登録制限チェック
17
18    Args:
19        name (str): チェックする名前
20        kind (str): チェック種別
21            - member
22            - team
23
24    Returns:
25        tuple[bool, str]: 判定結果
26        - bool: 制限チェック結果真偽
27        - str: 制限理由
28    """
29
30    def _pattern_gen(check_list: list[str]) -> list[str]:
31        ret: list = []
32        for x in check_list:
33            ret.append(x)
34            ret.append(textutil.str_conv(x, "k2h"))  # ひらがな
35            ret.append(textutil.str_conv(x, "h2k"))  # カタカナ
36
37        return list(set(ret))
38
39    check_pattern = _pattern_gen([name, formatter.honor_remove(name)])  # 入力パターン
40    ret_flg: bool = True
41    ret_msg: str = "OK"
42
43    # 名前チェック
44    check_list = _pattern_gen(list(g.member_list.keys()))  # メンバーチェック
45    if ret_flg and any(x in check_list for x in check_pattern):
46        ret_flg, ret_msg = False, f"「{name}」は存在するメンバーです。"
47
48    check_list = _pattern_gen([x["team"] for x in g.team_list])  # チームチェック
49    if ret_flg and any(x in check_list for x in check_pattern):
50        ret_flg, ret_msg = False, f"「{name}」は存在するチームです。"
51
52    if ret_flg and g.cfg.member.guest_name in check_pattern:  # ゲストチェック
53        ret_flg, ret_msg = False, "使用できない名前です。"
54
55    # 登録規定チェック
56    if ret_flg and len(name) > int(getattr(g.cfg, kind).character_limit):  # 文字制限
57        ret_flg, ret_msg = False, "登録可能文字数を超えています。"
58
59    if ret_flg and re.search("[\\;:<>(),!@#*?/`\"']", name) or not name.isprintable():  # 禁則記号
60        ret_flg, ret_msg = False, "使用できない記号が含まれています。"
61
62    # 引数と同名になっていないかチェック
63    if ret_flg and name in ExtDt.valid_keywords():
64        ret_flg, ret_msg = False, "検索範囲指定に使用される単語では登録できません。"
65
66    if ret_flg and CommandParser().is_valid_command(name):
67        ret_flg, ret_msg = False, "オプションに使用される単語では登録できません。"
68
69    if ret_flg and name in set(list(g.keyword_dispatcher) + list(g.command_dispatcher)):
70        ret_flg, ret_msg = False, "コマンドに使用される単語では登録できません。"
71
72    return (ret_flg, ret_msg)

登録制限チェック

Arguments:
  • name (str): チェックする名前
  • kind (str): チェック種別
    • member
    • team
Returns:

tuple[bool, str]: 判定結果

  • bool: 制限チェック結果真偽
  • str: 制限理由