# Changelog
## 0.9.13
- Multipart upload for photo, video and animation (parallel to `send_document`):
- New: `Sexy.Bot.Api.send_photo/5`, `send_video/5`, `send_animation/5`
- Top-level delegates: `Sexy.Bot.send_photo/5`, `send_video/5`, `send_animation/5`
- New `Sexy.Utils.Object` field `:upload_type` (`:photo | :video | :animation | :document | nil`)
drives multipart uploads. Detection prefers `upload_type` over `media`.
- `detect_object_type/1` no longer crashes when `media` is not a binary
(guards added; non-string media → `"unknown"`).
- Legacy `media: "file"` sentinel still works (equivalent to `upload_type: :document`).
## 0.9.12
- Fix `send_document` multipart format for hackney 1.25.0.
Use standard 4-tuple `{"document", binary, disposition, []}` instead of `{binary, disposition, []}`.
## 0.9.11
- Add `after: seconds` option to `notify/3` for auto-deleting notifications.
## 0.9.10
- Add delayed deletion: `delete_message(chat_id, mid, after: seconds)`.
Runs asynchronously via `Task` — accepts integers and floats.
## 0.9.9
- Fix `send_document` badarg when sending binary content as multipart.
HTTPoison was interpreting `{:file, binary, ...}` as a file path instead of raw content.
## 0.9.8
- Replace individual `*_pid` fields in `Sexy.TDL.Registry` with Elixir `Registry`-backed
worker discovery (`Sexy.TDL.Workers`). Workers auto-unregister on death — no stale PIDs.
New API: `register_worker/2`, `get_worker/2`, `list_workers/1`
- Add `Sexy.TDL.Workers` (Elixir Registry, `:unique` keys) to supervision tree
## 0.9.7
- Add client process pid fields to `Sexy.TDL.Registry` defstruct
(`sorter_pid`, `updater_pid`, `sender_pid`, `answerer_pid`, `reactor_pid`, `direct_pid`)
## 0.9.6
- Add Telegram Payments (Stars) support in Poller and Session:
- Route `pre_checkout_query` updates to `handle_pre_checkout/1` callback
- Route `successful_payment` messages to `handle_successful_payment/1` callback
- Both callbacks are optional: pre_checkout auto-approves, successful_payment logs
- `successful_payment` clause placed before general `message` to ensure correct matching
## 0.9.5
- Rewrite `bot-quickstart.md` for beginners: add intro (single-message UI concept),
BotFather step, split Session into 3 blocks (Storage, Dispatch, Screens),
explain update structure, callback_query, inline_keyboard layout, answer_callback,
add "How it works" flow diagram
- Replace all Russian comments and log messages with English
- Rename `extra` → `update_data` in Session callback definition, docs, and examples
for consistency with `Sexy.Utils.Object.update_data` field
- Fix Screen module examples to use `Sexy.Bot.build/send` (public API) instead of
`Sexy.Bot.Screen.build` / `Sexy.Bot.Sender.deliver` (internal modules)
## 0.9.4
- Add comprehensive test suite: 113 tests, 0 failures (7 test files)
- `mox` + `bypass` test dependencies for HTTP stubbing and behaviour mocking
- Pure function tests: Utils, Utils.Bot, Utils.Object, Bot.Screen
- Integration tests with Bypass: Bot.Api, Bot.Sender, Bot.Notification
- Add `credo` dependency, pass `mix credo --strict` (0 issues)
- Add 66 `@spec` annotations and `@type` definitions across 10 modules
- Refactor `get_message_type`: 11-branch cond → `Enum.find_value` over `@message_types`
- Refactor `fiat_chunk`: extract `format_integer_part/1` + `join_chunks/1`, remove 100 lines of duplication
- Refactor `Sender.deliver`: extract `parse_mode/1`, `send_by_type/4`, `update_screen/3` (complexity 10→3, nesting 3→1)
- Refactor `Handler.recursive_match`: extract `recurse_if_typed/2` (nesting 3→1)
- Fix credo issues: alias ordering, `Enum.map_join`, `unless`→`if`, nested module refs→aliases
- Run `mix format` on all files
## 0.9.3
- Add comprehensive ExDoc documentation with `@moduledoc` and `@doc` for all modules/functions
- Add quickstart guides: `bot-quickstart.md`, `tdl-quickstart.md`
- Add hex.pm packaging config (description, package, docs)
- Filter auto-generated TDL.Object/Method submodules from docs
- Expand README with Object struct, send options, and notify options documentation
- Add MIT LICENSE
## 0.9.2
- Flatten `lib/` structure: remove redundant `lib/sexy/` nesting
## 0.9.1
- Move all Bot modules under `Sexy.Bot` namespace:
- `Sexy.Api` → `Sexy.Bot.Api`
- `Sexy.Sender` → `Sexy.Bot.Sender`
- `Sexy.Notification` → `Sexy.Bot.Notification`
- `Sexy.Poller` → `Sexy.Bot.Poller`
- `Sexy.Screen` → `Sexy.Bot.Screen`
- `Sexy.Session` → `Sexy.Bot.Session`
## 0.9.0
**Breaking**: `Sexy` split into `Sexy.Bot` + `Sexy.TDL`.
- `Sexy` module is now a namespace only — use `Sexy.Bot` as supervisor entry point
- All Bot API functions moved: `Sexy.*` → `Sexy.Bot.*`
- New `Sexy.TDL` — TDLib integration for userbot sessions
- `Sexy.TDL.open/3`, `close/1`, `transmit/2` — session management
- `Sexy.TDL.Backend` — port to tdlib_json_cli binary
- `Sexy.TDL.Handler` — JSON deserialization + event routing
- `Sexy.TDL.Registry` — ETS-based session storage
- `Sexy.TDL.Riser` — per-account supervisor
- 2558 auto-generated Method/Object structs from TDLib API
- New mix tasks: `mix sexy.tdl.setup`, `mix sexy.tdl.generate_types`
- Migration guide: see MIGRATION.md
## 0.8.2
- Add Telegram Stars payment methods (send_invoice, answer_pre_checkout, refund_star_payment)
- Add wallet_init for Wallet.tg integration
## 0.8.1
- Built-in /_transit route for navigation between screens
## 0.8.0
**Breaking**: Sexy is now a Supervisor, not an Application.
- Start with `{Sexy, token: "...", session: MySession}` in supervision tree
- `Sexy.Session` behaviour — single integration point (persistence + dispatch)
- Removed `Sexy.Application`, `Sexy.Visor`, config-based dispatch
- Config replaced with `persistent_term` (no more `:sexycon`)
- Added `build/1`, `send/1-2`, `notify/2-3` facade functions
- Hardcoded dismiss_text default to "OK"
- Removed `wrap_text` from Sender
## 0.7.4
- Add `Sexy.Notification` — overlay/replace notification pattern
- Dismiss button with built-in `/_delete` route in Poller
- Configurable `dismiss_text` via `Application.get_env(:sexy, :dismiss_text)`
## 0.7.3
- Remove 26 legacy short-name delegates (pm, dm, um, ui, etc.)
- Remove unused `api_url/1`
## 0.7.2
- Add `Sexy.Session` behaviour (`get_message_id/1`, `on_message_sent/4`)
- Add `Sexy.Sender` — delivers Object, manages mid lifecycle via Session callbacks
- Add `Sexy.Screen` — converts app maps to Object structs
- `Sexy.Utils.Object`: add `chat_id`, rename `update_user` → `update_data`
## 0.7.1
- Create `Sexy.Api` with readable method names (send_message, delete_message, etc.)
- Consolidate HTTP into `do_request/3` and `do_multipart/3`
- Rewrite `Sexy` as facade with `defdelegate` to `Sexy.Api`
- Legacy short names kept as backward-compat delegates
## 0.7.0
- Initial extraction from OrderMachine into standalone library
- Modules: Sexy (API client), Sexy.Poller, Sexy.Visor, Sexy.Utils, Sexy.Utils.Bot, Sexy.Utils.Object
- Dependencies: HTTPoison, Jason, Base62