class GlobalConfig(ParseableConfigObject): debug: DebugConfig = conf_field(to_json=False) server: ServerConfig = conf_field(to_json=False) database: DatabaseConfig = conf_field(to_json=False) game: GameConfig users: UserConfig chat: ChatConfig
class ChatConfig(ParseableConfigObject): max_length: int = conf_field(min=1) blacklist: Sequence[str] = conf_field(to_json=False, validate=_validate_blacklist_syntax) def is_valid_message(self, message: str): message = message.strip() if not 1 <= len(message) <= self.max_length: return False # TODO: check for bad unicode characters return _validate_against_blacklist(message, self.blacklist)
class BlankCardConfig(ParseableConfigObject): count: IntOptions = conf_field(min=0) max_length: int = conf_field(min=1) blacklist: Sequence[str] = conf_field(to_json=False, validate=_validate_blacklist_syntax) def is_valid_text(self, text: str): text = text.strip() if not 1 <= len(text) <= self.max_length: return False # TODO: check for bad unicode characters return _validate_against_blacklist(text, self.blacklist)
class GamePasswordConfig(ParseableConfigObject): length: IntOptions = conf_field(min=0) characters: str = conf_field(min_length=1) def make_options_field(self): return field(default_factory=self._generate_default_password, metadata={ "min_length": self.length.min, "max_length": self.length.max }) def _generate_default_password(self): return generate_code(self.characters, self.length.default)
class UsernameConfig(ParseableConfigObject): length: IntLimits = conf_field(min=1) characters: str = conf_field(min_length=1) blacklist: Sequence[str] = conf_field(to_json=False, validate=_validate_blacklist_syntax) def is_valid_name(self, username): if len(username) not in self.length.as_range(): return False # TODO: check for bad unicode characters bad_regex = r"^ | {2}| $|[^" + self.characters + r"]" if re.search(bad_regex, username): return False return _validate_against_blacklist(username, self.blacklist)
class GameTitleConfig(ParseableConfigObject): max_length: int = conf_field(min=0) default: str blacklist: Sequence[str] = conf_field(to_json=False, validate=_validate_blacklist_syntax) def make_options_field(self): return field(default="", metadata={ "max_length": self.max_length, "validate": self._validate_title }) def _validate_title(self, title: str): # no need to validate length as the field has max_length # TODO: check for bad unicode characters if not _validate_against_blacklist(title, self.blacklist): raise ConfigError(None, "%s: blacklisted words used")
class GameConfig(ParseableConfigObject): title: GameTitleConfig password: GamePasswordConfig public: GamePublicityConfig think_time: IntOptions = conf_field(min=1) round_end_time: IntOptions = conf_field(min=1) idle_rounds: IntOptions = conf_field(min=1) blank_cards: BlankCardConfig player_limit: IntOptions = conf_field(min=3) point_limit: IntOptions = conf_field(min=1) hand_size: int = conf_field(min=2) code: GameCodeConfig
class BotConfig(ParseableConfigObject): count: int = conf_field(min=0, max=1000) game_size: int = conf_field(min=3) create_games: bool play_speed: NormalDistributionOptions game_options: dict
class UserConfig(ParseableConfigObject): username: UsernameConfig disconnect_kick_time: int = conf_field(min=1, to_json=False) disconnect_forget_time: int = conf_field(min=1, to_json=False)
class GameCodeConfig(ParseableConfigObject): length: int = conf_field(min=1) characters: str = conf_field(min_length=2)
class ServerConfig(ParseableConfigObject): host: str port: int = conf_field(min=1, max=65535)