Skip to content

fix: validate invoke input and tdjson init#44

Closed
pageton wants to merge 10 commits into
pytdbot:mainfrom
pageton:fix/input-validation
Closed

fix: validate invoke input and tdjson init#44
pageton wants to merge 10 commits into
pytdbot:mainfrom
pageton:fix/input-validation

Conversation

@pageton
Copy link
Copy Markdown
Contributor

@pageton pageton commented May 20, 2026

Summary

  • validate inputs passed to invoke()
  • guard tdjson initialization assumptions
  • build on the existing perf/fix stack

Validation

  • branch tip verified with git verify-commit

pageton added 10 commits May 20, 2026 16:46
- to_camel_case: replace O(n^2) string concat with list+join
- escape_markdown: pre-build sets for O(1) char membership
- get_message_methods: use frozenset (shared constant)
- plugin loading: use set for O(1) dedup instead of list scan
- dict_to_obj: cache getattr(types, ...) lookups in a module-level
  dict to avoid repeated to_camel_case + dynamic attribute resolution
  on every nested TDLib object
- Extract __run_handler_group from three identical ~35-line methods
  (__run_initializers, __run_handlers, __run_finalizers) into a
  single parameterized method. Reduces ~100 lines of duplication.
- remove_handler: replace O(n*m) list.copy()+list.remove() with
  single-pass in-place deletion
- add_handler: use sorted insertion instead of append+full re-sort
Callers already pass dicts, so check isinstance before converting.
Skips a full recursive traversal on already-converted data.
Reduces per-instance memory by ~40% (no __dict__, no __weakref__).
Handler instances are created per registered callback — hundreds
in a typical bot.
- Wrap debug-level f-string logs with isEnabledFor(DEBUG) check
  to skip string formatting when debug is disabled
- Simplify is_coro_filter cache lookup to use dict.get
- Move receive() into its own try/except with continue to prevent
  a single malformed response from killing the entire receiver loop
- Use dict.get() for @client_id to avoid KeyError on updates missing
  the field, log a warning instead
- Log the update @type when @client_id is missing for debug context
- __aexit__: log stop() errors instead of silently swallowing them
- AuthorizationError: accept code parameter, pass TDLib error code
  at both raise sites so callers can inspect it
- Add WebAppDataError base class for WebAppData* exceptions
- Export WebAppDataError in __all__
- strings.get_retry_after_time: catch ValueError/AttributeError
  instead of Exception, prevents masking unexpected errors in
  flood-wait handling
- json_utils.load_callback_data: catch ValueError/TypeError
  instead of Exception, add empty data guard to prevent IndexError
- invoke(): validate request is a dict with @type before accessing
  it, giving a clear ValueError instead of a cryptic KeyError
- tdjson._build_client(): validate TDLib getOption responses have
  a 'value' key before indexing, raise RuntimeError with context
@AYMENJD AYMENJD closed this May 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants