REPOSITORY / ScuroNeko/Laniakea

Releases

RELEASES REPOSITORY
  • 1.0.0 RC 10 Pre-Release

    ScuroNeko released this 2026-03-25 18:07:41 +03:00 | 57 commits to dev since this release

    Added

    • Plugin.AddUpdateHandler for routing non-command Telegram updates by tgapi.UpdateType.
    • Derived tgapi.Update.Type assignment during JSON decoding, plus tgapi.UpdateTypeUnknown for unmatched payloads.
    • tgapi.API.OpenFileByLink(...) and OpenFileByLinkWithContext(...) for streaming downloads from Telegram's file server.
    • Regression tests for update dispatch, keyboard builders, localization fallback, runners, rate limiting, parse mode encoding, streaming downloads, and context isolation.
    • Regression tests for bot single-run enforcement, nil plugin registration, L10n concurrent access, API.Close() idle-connection cleanup, and tgapi worker-pool edge cases.
    • SEMVER.md documenting versioning expectations for the project.

    Changed

    • NewBot now returns (*Bot[T], error) instead of terminating the host process on configuration or startup failures.
    • Run and RunWithContext now return errors; RunWithContext returns ErrNoPrefixes and ErrNoPlugins for invalid bot configuration.
    • Polling retries now use exponential backoff instead of busy-looping on repeated getUpdates failures.
    • Bot is now explicitly single-use; repeated Run() or RunWithContext(...) calls return ErrBotAlreadyRun.
    • Database context wiring now uses T consistently instead of forcing *T; shared dependencies should typically use pointer types such as *sql.DB.
    • DatabaseContext, GetDBContext, and DbLogger were updated to the new T-based dependency model.
    • DatabaseContext(...) now warns once when T is a value type, to highlight likely unintended copying of shared dependencies.
    • AddDatabaseLoggerWriter(...) now skips unset and nil database contexts instead of calling the writer with invalid values.
    • L10n is now safe for concurrent use and copies added dictionary entries to avoid external mutation after registration.
    • Plugin registration now snapshots commands, payloads, middlewares, and update handlers so later mutations of the original *Plugin do not leak into the bot.
    • AddPlugins(...) now skips nil plugin pointers instead of panicking.
    • GetUpdateTypes() now returns a copy instead of exposing internal slice state.
    • Update handling now normalizes MsgContext for more Telegram update kinds and routes plugin-level update handlers with isolated context copies.
    • message, channel_post, and callback_query remain on the command/payload flow; non-command updates can be handled through plugin update handlers.
    • Command auto-generation now validates Telegram command names with the correct character set and 1..32 length limit, and emits commands in deterministic sorted order.
    • Builder-style APIs were normalized to value returns for NewCommandArg, NewMiddleware, NewRunner, and NewCallbackData.
    • MenuButton replaced BaseMenuButton, and GetChatMenuButton(...) now returns the renamed type.
    • Several Telegram DTOs were tightened for optionality and serialization correctness, including InputPaidMedia, MenuButton, optional gift fields, and message entity slices.
    • tgapi.NewRequest(...), NewRequestWithChatID(...), NewUploaderRequest(...), and NewUploaderRequestWithChatID(...) are now documented as low-level unsafe escape hatches rather than internal helpers.
    • tgapi.API.Close() now closes idle HTTP connections before releasing logger resources.
    • Multipart form encoding now writes scalar field bytes directly instead of converting through temporary strings.
    • README, README_RU, package docs, and exported godoc were updated to match the current APIs and concurrency/lifecycle model.
    • Version constants were bumped to v1.0.0-rc.10.

    Fixed

    • Required command arguments are now enforced by declared argument index, not only by total required count.
    • ParseNone now omits parse_mode from JSON requests instead of serializing "None".
    • Upload file type detection is now case-insensitive for file extensions.
    • Draft creation no longer panics when no limiter is configured, and draft flushing now rejects zero chat IDs before sending invalid requests.
    • Channel posts with SenderChat no longer panic in the command path and now preserve the expected MsgContext fields.
    • File logger initialization now falls back to stdout loggers instead of terminating the process on logger setup failures.
    • GetChatMenuButton and SetChatMenuButton now serialize chat_id correctly when omitted.
    • Update decoding tests now match the canonical deleted_business_messages model and no longer rely on the removed singular alias.

    Breaking Changes

    • NewBot[T](opts) now returns (*Bot[T], error).
    • Run() now returns error.
    • RunWithContext(ctx) now returns error.
    • Run() and RunWithContext(ctx) are now single-use per bot instance; create a new Bot after they return.
    • Database context handlers now receive T instead of *T. For shared dependencies, instantiate the bot with a pointer type, for example Bot[*sql.DB].
    • DatabaseContext(...) now takes T instead of *T.
    • GetDBContext() now returns T instead of *T.
    • DbLogger[T] now receives T instead of *T.
    • NewCommandArg(...), NewMiddleware(...), NewRunner(...), and NewCallbackData(...) now return values instead of pointers.
    • BaseMenuButton was renamed to MenuButton, and GetChatMenuButton(...) now returns MenuButton.
    • tgapi.Update no longer exposes the deprecated DeletedBusinessMessage alias; use DeletedBusinessMessages.

    Tests

    • Added coverage for polling backoff helpers, command sorting, database logger safety checks, update handler routing, update-context isolation, channel posts with SenderChat, parse mode encoding, streaming downloads, and rate limiter behavior.

    Full Changelog: v1.0.0-rc.9...v1.0.0-rc.10

    Downloads